Java集合框架包含List(ArrayList、LinkedList)、Set(HashSet、TreeSet)、Queue(PriorityQueue)和Map(HashMap、ConcurrentHashMap),通过动态数组、链表、红黑树等数据结构实现,提供线程安全方案如分段锁、CAS及写时复制,适用于高并发与不同访问场景。
一、Java 集合框架类图(Mermaid)
IterableCollection«interface»List+add()+get()+remove()«interface»Set+add()+contains()«interface»Queue+offer()+poll()«interface»Map+put()+get()SortedMapArrayListLinkedListVectorCopyOnWriteArrayListHashSetLinkedHashSetTreeSetCopyOnWriteArraySetPriorityQueueArrayDequeLinkedBlockingQueueHashMapLinkedHashMapTreeMapHashtableConcurrentHashMap
二、核心接口与实现类
1. List(有序、可重复)
-
实现类:
- ArrayList:基于动态数组,随机访问快(O(1)),插入删除慢(O(n))。
- LinkedList:基于双向链表,插入删除快(O(1)),随机访问慢(O(n))。
- Vector:线程安全的动态数组(同步方法),性能差。
- CopyOnWriteArrayList:写时复制,线程安全,适合读多写少场景。
-
线程安全:
Vector和Collections.synchronizedList(new ArrayList<>())是同步实现。CopyOnWriteArrayList通过写时复制实现无锁读。
-
使用场景:
- 需要快速随机访问 →
ArrayList。 - 频繁插入删除 →
LinkedList。 - 多线程环境 →
CopyOnWriteArrayList或同步包装类。
- 需要快速随机访问 →
2. Set(无序、唯一)
-
实现类:
- HashSet:基于
HashMap,无序,O(1) 时间操作。 - LinkedHashSet:维护插入顺序的
HashSet。 - TreeSet:基于红黑树,自然排序,O(log n) 时间操作。
- CopyOnWriteArraySet:基于
CopyOnWriteArrayList,线程安全。
- HashSet:基于
-
线程安全:
CopyOnWriteArraySet和Collections.synchronizedSet()。
-
使用场景:
- 去重 →
HashSet。 - 需要有序 →
TreeSet(排序)或LinkedHashSet(插入顺序)。
- 去重 →
3. Queue(队列)
-
实现类:
- PriorityQueue:基于堆,优先级队列。
- ArrayDeque:基于循环数组,双端队列。
- LinkedBlockingQueue:基于链表,阻塞队列(线程安全)。
-
线程安全:
LinkedBlockingQueue和ArrayBlockingQueue是线程安全的阻塞队列。
-
使用场景:
- 任务调度 →
PriorityQueue。 - 生产者-消费者模型 →
LinkedBlockingQueue。
- 任务调度 →
4. Map(键值对)
-
实现类:
- HashMap:基于哈希表+链表/红黑树(JDK8+),无序。
- LinkedHashMap:维护插入顺序或访问顺序。
- TreeMap:基于红黑树,按键排序。
- Hashtable:线程安全的
HashMap(同步方法)。 - ConcurrentHashMap:分段锁(JDK7)或 CAS(JDK8+),高并发优化。
-
线程安全:
Hashtable和Collections.synchronizedMap()是同步实现。ConcurrentHashMap是高性能线程安全实现。
-
使用场景:
- 快速键值查找 →
HashMap。 - 高并发 →
ConcurrentHashMap。 - 需要排序 →
TreeMap。
- 快速键值查找 →
三、核心实现原理
| 集合类 | 数据结构 | 扩容机制 | 线程安全实现方式 |
|---|---|---|---|
| ArrayList | 动态数组 | 默认扩容为 1.5 倍(int newCapacity = oldCapacity + (oldCapacity >> 1)) | Collections.synchronizedList |
| LinkedList | 双向链表 | 无需扩容 | 无 |
| HashMap | 数组+链表/红黑树 | 负载因子(默认 0.75)触发扩容 | ConcurrentHashMap(分段锁/CAS) |
| ConcurrentHashMap | 分段锁(JDK7)或 CAS(JDK8+) | 分段扩容 | 锁粒度更细 |
| CopyOnWriteArrayList | 动态数组 | 写时复制新数组 | 无锁读,写操作加锁 |
四、线程安全方案对比
| 方案 | 实现方式 | 适用场景 | 缺点 |
|---|---|---|---|
synchronized 方法 | 方法级同步(如 Vector) | 低并发场景 | 性能差(锁竞争) |
| 同步包装类 | Collections.synchronizedXxx() | 简单同步需求 | 锁粒度粗 |
| 写时复制(COW) | CopyOnWriteArrayList | 读多写少 | 写操作开销大 |
| 分段锁(JDK7) | ConcurrentHashMap 分段锁 | 高并发读写 | 锁粒度较细 |
| CAS(JDK8+) | ConcurrentHashMap 的 CAS | 高并发且低竞争 | 实现复杂 |
五、总结
-
选择依据:
- 是否线程安全:单线程选非同步类(如
ArrayList),多线程选ConcurrentHashMap或CopyOnWriteArrayList。 - 访问模式:随机访问 →
ArrayList,插入删除 →LinkedList。 - 排序需求:自然排序 →
TreeSet/TreeMap,插入顺序 →LinkedHashSet/LinkedHashMap。 - 性能与内存:
ArrayDeque比LinkedList内存更紧凑,HashMap的负载因子可调整。
- 是否线程安全:单线程选非同步类(如
-
最佳实践:
- 避免在循环中直接操作
Collections.synchronizedXxx集合。 - 高并发场景优先使用
ConcurrentHashMap或CopyOnWriteArrayList。
- 避免在循环中直接操作