java集合包数据结构图解
Collection
List
ArrayList
- 数据结构图
- - 点评
ArrayList
是一个其容量能够动态增长的动态数组,最大长度限制 Integer.MAX_VALUE - 8 ,但是真实限制长度也会受到JVM的限制,可能小于这个值,默认初始长度为10(为什么是10而不是8?!)。 它继承了AbstractList
,实现了List
、RandomAccess
,Cloneable
,java.io.Serializable
。
ArrayList
添加元素如果数组满了就需要调整数组长度,最后会使用Arrays.copyOf
方法做一次数据拷贝,最好能保证初始化一个具体的长度避免这种情况。同理,删除元素也会涉及到数组整体数据的移动,所以可以理解ArrayList
不擅长做添加删除操作,但是它的获取元素操作性能最优。
LinkedList
- 数据结构图
- 点评
LinkedList
核心数据是带有前后指针的内部实现类组成的链表,链表没有长度限制, 它继承了AbstractSequentialList
,实现了List
、Deque
,Cloneable
,java.io.Serializable
。
由数据结构可以知道LinkedList
的操作性能很好,因为实现了双向队列接口Deque
,LinkedList
可以从头或尾操作数据。
但是读取性能不好。
Vector => Stack
- 数据结构图
参考ArrayList
- 点评
Stack
继承Vector
,后者的实现与ArrayList
一毛一样,不同的是Vector
的数据增减操作都是线程安全的,对方式使用了synchronized
。
Queue
PriorityQueue
- 数据结构图
- 点
PriorityQueue
核心数据也是一个其容量能够动态增长的动态数组,它的增长规则与ArrayList
一样。 它继承了AbstractQueue
,实现了java.io.Serializable
。
添加元素时除了会像ArrayList
一样做扩容处理外,它还会根据构造时设置的Comparator
规则对元素做排序,所以出队列的元素都是按顺序的。
Set
TreeSet
- 数据结构图
参考TreeMap
- 点评
TreeSet
与TreeMap
的区别在于树节点存的内容,Set是单个值,Map是KV对。TreeSet
不会出现重复值,TreeMap
会有重复。
HashSet
- 数据结构图
参考HashMap
- 点评
HashSet
与HashMap
的区别在于树节点存的内容,Set是单个值,Map是KV对。HashSet
不会出现重复值,HashMap
会有重复。
Map
Dictionary
Hashtable
- 数据结构图
- 点评
Hashtable
核心数据结构在于一个数组,元素为自己内部实现类Entry
,Entry
有个指向下一个Entry
的指针,因此Entry
可以组成一个链表。与HashMap
一样,在添加数据时,数据大小达到阈值后出发rehash,重新调整数组大小和Entry
连接。Hashtable
的数据操作在方法上使用synchronized
保证线程安全。它继承了Dictionary
,实现了Map<K,V>, Cloneable, java.io.Serializable
。
AbstractMap
HashMap
- 数据结构图
- 点评
HashMap
核心数据结构为一个动态增长的数组,数组元素为HashMap的内部实现类Node
,维持一个向后的指针。通过对添加K-V的key值做hash计算,将数据填入数组,遇到hash冲突的数据就通过Node
的next连接上去。java1.8以后当Node
链长度超过8时,会将Node
转成TreeNode
,TreeNode
结构上是一个树,提高了查询效率。
另外,添加新数据后,数据size超过某一阈值后,HashMap
会将数组长度X2,所有Node
也会根据新的hash值重新散列。
TreeMap
- 数据结构图
- 点评
TreeMap
核心数据结构是一个红黑树,添加节点数据就是依据构造时设置的Comparator
排序设置树节点,因此它是有序的。