主要分为List、Set、Map,大的特性是List有序,Set去重、Map k-v结构
List
1.ArrayList
底层使用数组实现,优点是可以快速随机访问,缺点是达到数组预定义边界需要自动扩容(扩容一半),影响效率,最好提前指定好容量;
初始容量10,达到容量时扩容,容量变为1.5倍
2.LinkedList
3.Vector
与ArrayList功能差不多,不过Vector是线程安全的(通过在方法上加Synchronized实现),在多线程环境下使用;
JUC扩展:
4.LinkedBlockingQueue
5.CopyOnWriteArrayList
读多写少时使用,使用ReentrantLock实现,只在写的时候加锁(不直接往当前容器添加,而是先将当前容器进行 Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器,所以会有数据不一致的问题,特殊场景使用)
Map
1.HashMap
底层数据结构使用数组+链表或红黑树(链表长度大于等于8)
初始容量16,达到容量0.75时扩容,容量翻倍
2.LinkedHashMap
3.TreeMap
底层使用红黑树
红黑树规则特点:
节点分为红色或者黑色;
根节点必为黑色;
叶子节点都为黑色,且为null;
连接红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点);
从任意节点出发,到其每个叶子节点的路径中包含相同数量的黑色节点;
新加入到红黑树的节点为红色节点;
红黑树自平衡基本操作:
变色:在不违反上述红黑树规则特点情况下,将红黑树某个node节点颜色由红变黑,或者由黑变红;
左旋:逆时针旋转两个节点,让一个节点被其右子节点取代,而该节点成为右子节点的左子节点
右旋:顺时针旋转两个节点,让一个节点被其左子节点取代,而该节点成为左子节点的右子节点
4.ConcurrentHashMap
与HashMap基本相同,使用synchronized在特定代码块上加锁(node节点链表加锁),线程安全
5.ConcurrentSkipListMap
在传统的单链表结构中,查找某个元素需要从链表的头部按顺序遍历,直到找到目标元素为止,查找的时间复杂度为O(n)。
而跳表结合了树和链表的特点,其特性如下:
跳表由很多层组成;
每一层都是一个有序的链表;
最底层的链表包含所有元素;
对于每一层的任意一个节点,不仅有指向其下一个节点的指针,也有指向其下一层的指针;
如果一个元素出现在Level n层的链表中,则它在Level n层以下的链表也都会出现。