- ArrayList: 动态数组,支持动态增长。
- LinkedList: 双向链表,支持快速的插入和删除操作。
- HashSet: 基于HashMap实现的Set集合,用于存储唯一元素。
- LinkedHashSet:在保证元素唯一的同时,能按插入顺序访问。
- TreeMap: 基于红黑树实现的有序Map集合,可以按照键的顺序进行排序。
- LinkedHashMap: 基于哈希表和双向链表实现的Map集合,保持插入顺序或访问顺序。
- PriorityQueue: 优先队列,可以按照比较器或元素的自然顺序进行排序。
ArrayList[数组]:可变列表,非线程安全(方法无锁)。底层采用数组实现。扩容时采用剪切数组的方式。支持对元素的快速随机访问。尾部操作效率高,中部操作效率低。
Vecor[数组]:线程安全的动态数组,内部方法基本都有synchronized修饰。扩容时采用剪切数组的方式。
HashSet:底层通过HashMap实现,HashMap的Key就是HashSet存储的元素,Value全部相同。由Key的不可重复特性保证元素唯一。
TreeSet:
HashMap:JDK1.8之前采用数组+链表,其中数组记录桶的index,一个桶存放很多个键值对(类似于Redis图形化界面),链表是为了解决Hash冲突。JDK1.8之后采用数组+链表/红黑树:当数组长度(桶个数)>=64且链表长度>=8(依据泊松分布,长度为8的概率很低)时会将链表转为红黑树。当节点长度<7时转回链表。
TreeMap:
HashTable:线程安全的哈希表,会锁整个T哈希表,不推荐使用。
BlockingQueue:
LinkedList[链表]:双向链表,支持高效的头尾插入/删除和作为双端队列使用。需要注意的是:”LinkedList 插入/删除比 ArrayList 更快”是一个常见误区:其 O(1) 的前提是已经持有目标节点的引用;如果要在任意位置插入/删除,仍需先 O(n) 遍历链表找到位置,大多数场景下 LinkedList 反而比 ArrayList 慢,这也是现在主流建议优先使用 ArrayList 的原因。
LinkedHashSet:通过LinkedHashMap实现,有序。应用场景:浏览器历史记录
LinkedHashMap:基于HashMap,加入了双向链表保证按插入顺序排序。同时是尾插法,当数组长度满了自动删头部数组,可用于实现LRU(最近最少使用)缓存。
LinkedBlockingDeque:
ConcurrentHashMap:线程安全,Node数组+链表+红黑树实现。锁的是段(包含多个桶),锁粒度小。JDK1.8之后锁的是桶,粒度更小.
ConcurrentSkipListSet:
ConcurrentSkipListMap:
ConcurrentLinkedQueue:
ConcurrentBlockingDeque:
CopyOnWriteArrayList:
CopyOnWriteArraySet:



