java集合框架知识图谱
集合关系图谱
Java集合框架包括Collection和Map,Collection主要用于存储对象,Map主要用用于存储键值对数据。
介绍
容器,就是可以容纳其他Java对象的对象。*Java Collections Framework(JCF)*为Java开发者提供了通用的容器,其始于JDK 1.2,优点是:
- 降低编程难度
- 提高程序性能
- 提高API间的互操作性
- 降低学习难度
- 降低设计和实现相关API的难度
- 增加程序的重用性
Java容器里只能放对象,对于基本类型(int, long, float, double等),需要将其包装成对象类型后(Integer, Long, Float, Double等)才能放到容器里。很多时候拆包装和解包装能够自动完成。这虽然会导致额外的性能和空间开销,但简化了设计和编程。
Collection
List
ArrayList简介
1.ArrayList继承自AbstractList
,实现了List
、RandomAccess
、Cloneable
、Serializable
接口。
2.底层基于动态数组实现容量大小动态变化(容量可自动增长)。
3.允许null
的存在。
4.ArrayList是支持快速访问、复制、序列化的。基于动态数组实现,支持。
5.ArrayList是非同步的。
6.ArrayList的iterator和listIterator方法返回的迭代器是fail-fast的。
LinkedList
1.LinkedList继承自AbstractSequentialList
,实现了List
、Deque
、Cloneable
、Serializable
接口,LinkedList是基于链表实现的,只能顺序访问。
2.LinkedList
插入和删除方面要优于ArrayList
。
3.LinkedList是非同步的。
4.LinkedList的iterator和listIterator方法返回的迭代器是fail-fast的。
Set
Hashset
1.HashSet继承自AbstractSet
,实现了Set
、Cloneable
、Serializable
接口,底层是一个HashMap。
2.HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于:hashCode与equals方法。
3.HashSet中元素都是无序的(即存取顺序不一致);
4.HashSet没有下标选取,只能通过增强for循环或者迭代器取出元素;
5.HashSet是非同步的;
6.HashSet的iterator方法返回的迭代器是fail-fast的。
LinkedHashSet
1.LinkedHashSet继承自HashSet
,实现了Set
、Cloneable
接口,底层其实是一个LinkedHashMap。
2.不能保证插入和输出的顺序一致。
3.不允许重复的元素插入,可以插入null。
4.HashSet的iterator方法返回的迭代器是fail-fast的。
TreeSet
1.TreeSet继承自AbstractSet
,实现了NavigableSet、Cloneable、Serializable接口。
2.一种基于TreeMap
的NavigableSet
实现,意味着它支持一系列的导航方法。
3.TreeSet是有序的Set集合,通过TreeMap
实现的一个有序的、不可重复的集合,底层维护的是红黑树结构。
4.TreeSet的iterator方法返回的迭代器是fail-fast的。
Queue
ArrayDeque
1.ArrayDeque是Deque接口的一个实现,使用了可变数组,所以没有容量上的限制。
2.ArrayDeque是线程不安全的,在没有外部同步的情况下,不能再多线程环境下使用。
3.ArrayDeque是Deque的实现类,可以作为栈来使用,效率高于Stack;
也可以作为队列来使用,效率高于LinkedList。
4.ArrayDeque不支持null值。
5.ArrayDeque的iterator方法返回的迭代器是fail-fast的。
6.ArrayDeque两端都可以操作,支持双向迭代器遍历。
PriorityQueue
1.PriorityQueue继承自AbstractQueue
,实现了Serializable
接口。
2.PriorityQueue队列元素根据自然排序或者根据具体的比较器排序。
3.PriorityQueue实例化时若未指定初始容量,默认容量为11。
4.PriorityQueue自动扩容。如果容量小于64,两倍增长扩容;否则增长50%,PriorityQueue是无边界容器。
5.PriorityQueue的迭代器不具有以特定顺序访问队列元素。
6.PriorityQueue不支持null
元素。
7.PriorityQueue入队出队的时间复杂度O(log(n))
Map
HashMap
1.HashMap继承自AbstractMap
,实现Map
、Cloneable
、Serializable
接口。
2.HashMap 基于哈希表的Map接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。
3.HashMap 的实现不是同步的,这意味着它不是线程安全的。
4.HashMap 中的映射不是有序的(即存取顺序不一致)。
5.JDK1.5-JDK1.7实现的结果是数组+链表,JDK1.8实现结构是数组+链表+红黑树。
6.HashMap key值能为null,value值可以为null,且key值不允许重复。
7.HashMap的iterator方法返回的迭代器是fail-fastl的。
LinkedHashMap
1.LinkedHashMap继承自HashMap
,实现了Map
接口。
2.LinkedHashMap维护了一个Entry的双向链表,保证了插入的Entry中的顺序。
3.使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。
4.LinkedHashMap的iterator方法返回的迭代器是fail-fastl的。
TreeMap
1.TreeMap 继承自AbstractMap,实现了NavigableMap
、Cloneable
、Serializable接口
。
2.TreeMap不允许出现重复的key。
3.TreeMap可以插入null键,null值。
4.TreeMap可以对元素进行排序。
5.TreeMap无序集合(插入和遍历顺序不一致)。
6.TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法。
7.TreeMap的iterator方法返回的迭代器是fail-fastl的。
HashTable
1.与HashMap一样,Hashtable也是一个散列表,是以key-value存储形式存在,即主要用来存放键值对;
2.与HashMap不同,Hashtable的函数都是同步的,这意味着它是线程安全的;
3.Hashtable的key、value都不可以为null,并且,Hashtable中的映射不是有序的;
4.实现结构是数组+单向链表。