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排序设置树节点,因此它是有序的。
