Java集合大致分为Set、List、Queue、Map四个体系

其中Set代表无序、不可重复的集合;List代表有序、重复集合;Map代表具有映射关系的集合;Queue是队列的实现。

集合和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),集合里面只能保存对象(实际上只是保存对象的引用变量)。

Java集合中有两个派生的 接口:Collection 和 Map
Collection集合体系的继承树:

​Java集合:Set、List、Queue、Map四个体系的归纳总结-LMLPHPMap集合体系的继承树:
​Java集合:Set、List、Queue、Map四个体系的归纳总结-LMLPHP

下面分别讲述
Set集合:
Set集合类似一个罐子,程序可以依次将多个对象“丢进”里面,Set不会记住元素的添加顺序,Set集合不允许有相同的元素。

HashSet:
特点:
不能保证元素的排列顺序
HashSet不是同步的
集合元素值可以为null
HashSet判断两个元素相等的标准是:两个对象通过equals()方法比较相等,并且两个对象的hashcode()方法返回值也相等。
注意:当把一个对象放进HashSet中时,如果需要重写该对象的equals()方法,则应该重写其hashCode()方法。规则是:如果两个对象通过equals()方法比较返回true,两个对象的hashCode值应该相同。

LinkedSet:
LinkedSet根据原始的hashCode的值来决定元素的存储位置,但是他同时使用链表维护元素的次序,这样使得元素的插入的顺序保存。LinkedSet会按照元素的添加顺序来访问集合里的元素。
LinkedSet需要维护元素的插入位置,因此性能会略低于HashSet的性能。

TreeSet:
TreeSet可以确保集合元素处于排序状态。
TreeSet并不是根据元素的插入顺序进行排序的,而是根据元素的实际值的大小来进行排序的。
TreeSet采用红黑树的数据结构来存储集合元素。
TreeSet支持两种排序方法:自然排序和定制排序。在默认情况下,TreeSet采用自然排序。

自然排序:TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列。在默认情况下,TreeSet采用自然排序。
当把一个对象加入TreeSet集合中时,TreeSet调用该对象的compareTo(Object obj)方法与容器中的其他对象比较大小,然后根据红黑树结构找到它的存储位置。
判断两个对象是否相等的唯一标准是:两个对象通过compareTo(Object obj)方法比较是否返回0。
如果两个对象通过equals()方法比较返回true时,这两个对象通过compareTo(Object obj)方法比较应返回0。

定制排序:如果需要实现定制排序,则需要在创建TreeSet集合对象时,提供一个Comparator对象与该TreeSet集合关联,由该Comparator对象负责集合元素的排序逻辑。

EnumSet:
EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类内部的定位顺序来决定集合元素的顺序。
EnumSet内部以位向量的形式存储。
EnumSet集合不允许加入null元素。

各Set实现类的性能分析:
HashSet的性能总比TreeSet好,因为TreeSet需要额外的红黑树算法来维护集合的次序。
LinkedSet对于普通的插入、删除操作,LinkedSet比HashSet要稍微慢一些,这是由维护链表所带来的额外开销造成的。但是由于有链表,遍历LinkedSet比较快。
EnumSet性能最好,但只能保存同一个枚举类得枚举值作为集合元素。

List:
List代表一个元素有序,可重复的结合,集合中的每个元素都有对应的顺序索引。
List集合可以根据位置索引来访问集合中的元素,因此List可以使用for循环来遍历。

ArrayList、LinkedList和Vector
ArrayList源码分析:
LinkedList源码分析:

Queue:
Queue用于模拟队列这种数据结构。
PriorityQueue:
PriorityQueue保存队列元素的顺序并不是按照加入的顺序,而是按照队列元素的大小进行排序的。
PriorityQueue不允许插入null元素。

Deque:
Deque接口是Queue接口的子接口,它代表一个双端队列。
当程序中需要使用“栈”这种数据结构时,推荐使用ArrayDeque。

各种线性表的性能分析:
1.如果需要遍历List集合元素,对ArrayList、Vector集合,应该使用随机访问方法(get)来遍历集合元素,这样性能更好;对于LinkedList集合应该使用迭代器(Iterator)来遍历集合元素。
2.如果需要经常执行插入、删除,应使用LinkedList。
3.如果多线程同时访问List集合中的元素,应该使用Collections将集合包装成线程安全的集合。

Map:
Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。
Map中存在一个keySet()方法,用于返回Map中所有key组成的Set集合。

HashMap、Hashtable:
HashMap和Hashtable的区别:
1.Hashtable是一个线程安全的Map,HashMap是非线程安全的,所以HashMap的性能比较好。
2.Hashtable不允许使用null作为key和value,HashMap允许使用null作为key或者value。

Hashtable、HashMap判断两个key相等的标准是:两个的key的equals()方法返回true,两个key的HashCode值相同;判断两个value相等的标准是value的equals()方法返回值相同。

LinkedMap:
LinkedMap会记住key-value的添加顺序。

TreeMap:
TreeMap也是采用了红黑树的结构,TreeMap中判断两个key相等的标准是:
两个key通过compareTo()方法的返回值为0.(在自然排序下)
两个key通过compareTo()方法的返回值为0.同时equals()方法比较返回为true。(定制排序下)。

EnumMap:
EnumMap内部以数组的形式保存。
EnumMap不允许使用null作为key,但是允许value为null。

Map的性能分析:
HashMap的性能要比Hashtable的性能要好。
TreeMap中的key-value对总是处于有序状态,无须进行专门的排序操作。
对于一般的运用场景,多考虑使用HashMap。
LinkedMap要比HashMap慢,是因为需要维护链表来保持key-value的添加顺序。
EnumMap的性能最好,但是只能使用同一个枚举类的枚举值作为key。

相关推荐:

Java集合Set、List、Map的遍历方法

一段代码搞懂关于Java中List、Set集合及Map的使用

以上就是​Java集合:Set、List、Queue、Map四个体系的归纳总结的详细内容,更多请关注Work网其它相关文章!

09-14 16:31