欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java集合—List 、 Set、 Map详解

程序员文章站 2022-05-02 12:52:07
...

一、集合与数组

数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用。

集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用。

二、集合

1、集合框架中不同的集合类有各种不同的数据结构,所以在使用中要根据应用的性能要求来选择不同的集合类, Java集合中实际存放的只是对象的引用,每个集合元素都是一个引用变量,实际内容都放在堆内存或者方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上数据随时就会被收回的。

  1. 基本类型数据如何解决呢?

可以通过包装类把基本类型转为对象类型,存放引用就可以解决这个问题。更方便的,由于有了自动拆箱和装箱功能,基本数据类型和其对应对象(包装类)之间的转换变得很方便,想把基本数据类型存入集合中,直接存就可以了,系统会自动将其装箱成封装类,然后加入到集合当中。

3、集合类存放在java.util包中,今后进行程序编程时将大量使用的集合类和相关接口,
如以下:

Iterable:迭代器接口

Collection:类集接口

List:列表接口

Set:数据集接口

Queue:队列

Map:键-值对组合映射表

java集合—List 、 Set、 Map详解
Iterable接口

实现改接口允许对象成为“Foreach”语句的目标,即改集合对象允许迭代。
类集接口Collection是Iterable的子接口,所以所有类集对象可以迭代访问,而映射Map不行。
方法
Iterator iterator()

功能: 返回一个在一组T类型的元素上进行迭代的迭代
java集合—List 、 Set、 Map详解
迭代器是实现了Iterator/ListIterator 接口的类的对象,可以通过遍历类集,访问操作其中的每个元素。

ListIterator 扩展了父接口Iterator,允许双向遍历集合,并可以修改和删除元素。

下面是ListIterator的方法介绍:

java集合—List 、 Set、 Map详解
下面是Iterator和ListIterator遍历区别:
java集合—List 、 Set、 Map详解
打印结果为:

使用Iterator迭代.
Amy Bob nCarl
使用ListIterator迭代

正向遍历: Amy Bob nCarl

反向遍历: nCarl Bob Amy

Collection接口定义的方法

Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
java集合—List 、 Set、 Map详解

List 、 Set、 Map

1、List(有序、可重复)

List接口扩展了Collection, List里存放的对象时有序的,同时也是可以重复的,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。

ArrayList.

优点: 底层数据结构是数组,查询快,增删慢。

缺点: 线程不安全,效率高

Vector.

优点: 底层数据结构是数组,查询快,增删慢。

缺点: 线程安全,效率低

LinkedList.

优点: 底层数据结构是链表,查询慢,增删快。

缺点: 线程不安全,效率高

2、Set(无序、不可重复)

Set接口扩展了Collection,Set集合存放的对象是无序,不能重复的,并且最多包含一个 null 元素。集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。

****HashSet.

底层数据结构是哈希表。(无序,唯一)

如何来保证元素唯一性?

1.依赖两个方法:hashCode()和equals()

LinkedHashSet.

底层数据结构是链表和哈希表。(FIFO插入有序,唯一)

1.由链表保证元素有序

2.由哈希表保证元素唯一

TreeSet.

底层数据结构是红黑树。(唯一,有序)

  1. 如何保证元素排序的呢?

自然排序

比较器排序

2.如何保证元素唯一性的呢?

根据比较的返回值是否是0来决定

3、Map(键值对、键唯一、值不唯一)

映射(map)是一个存储关键字/值对的对象。键不能重复,值可以重复。根据键得到值,给定一个关键字,可查询得到它的值,关键字和值都可以是对象。映射不是Collection的子接口。所以它本身不能使用迭代器来进行遍历。

针对collection集合我们到底该使用谁呢???

首选判断是否重复?

没有重复:

           用set

  排序么?

          排序:TreeSet或LinkedHashSet

         不排序:HashSet

重复:

       用List

是否需要安全?

               安全:Vector
              不安全:ArrayList或则LinkedList

                            查询多:ArrayList
                             增删多:LinkedList

总结:

如果你知道该用Set,但是不知道用哪个实现类,就用HashSet。

如果你知道用LIst,但是不知道是哪个list,就用ArrayList。

如果你知道是Collection集合,但是不知道使用谁,就用ArrayList ;

如果你知道用集合,就用ArrayList.

参考文献:https://blog.csdn.net/zhangqunshuai/article/details/80660974

相关标签: 集合