一、Java 集合框架的顶层架构概览
Java 集合框架(Java Collections Framework, JCF)是一套标准化的容器接口及实现,其设计遵循
接口与实现分离的原则,核心架构可分为三层:
- 接口层:定义集合的功能规范(如添加、删除、遍历)。
- 实现层:提供接口的具体数据结构实现。
- 工具层:封装集合操作的实用工具类。
二、核心接口层次结构
1. Collection 接口(集合框架的根接口之一)
-
子接口分类:
- List:有序、可重复集合,元素有索引。
- Set:无序、不可重复集合。
- Queue:队列接口,支持 FIFO(先进先出)操作。
2. Map 接口(键值对集合,独立于 Collection 体系)
-
子接口:
- SortedMap:按键排序的 Map。
- NavigableMap:支持范围查询的 SortedMap 扩展。
三、核心实现类与底层原理
1. List 接口实现类
| 实现类 | 底层数据结构 | 特点与应用场景 |
|---|---|---|
| ArrayList | 动态数组 | 随机访问高效,适合频繁查询,插入 / 删除效率低。 |
| LinkedList | 双向链表 | 插入 / 删除高效,适合频繁修改,随机访问效率低。 |
| Vector | 动态数组 | 线程安全,性能比 ArrayList 低(同步方法)。 |
| CopyOnWriteArrayList | 写时复制数组 | 适合读多写少的并发场景。 |
2. Set 接口实现类
- HashSet:基于 HashMap 实现,元素无序,通过哈希码定位,插入和查询效率高。
- TreeSet:基于 TreeMap 实现,元素有序(自然排序或定制排序),底层为红黑树。
- LinkedHashSet:继承 HashSet,通过链表维护插入顺序,兼顾效率和有序性。
3. Map 接口实现类
| 实现类 | 底层数据结构 | 特点与应用场景 |
|---|---|---|
| HashMap | 哈希表(数组 + 链表 + 红黑树) | JDK8 后引入红黑树优化哈希冲突,查询 O (1)。 |
| TreeMap | 红黑树 | 按键排序,适合需要有序遍历的场景。 |
| ConcurrentHashMap | 分段锁(JDK7)/CAS+Node + 红黑树(JDK8) | 线程安全的高并发 Map,性能优于 HashTable。 |
| LinkedHashMap | 哈希表 + 双向链表 | 维护插入顺序或访问顺序(LRU 缓存常用)。 |
4. Queue 接口实现类
- LinkedList:同时实现 List 和 Queue 接口,支持双向队列操作。
- ArrayBlockingQueue:有界阻塞队列,基于数组实现,常用于生产者 - 消费者模式。
- PriorityQueue:优先队列,元素按优先级排序,底层为堆结构。
四、工具类与辅助接口
-
Collections 工具类:
- 提供排序(
sort())、查找(binarySearch())、同步包装(synchronizedList())等方法。 - 示例:
List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
- 提供排序(
-
Arrays 工具类:
- 用于数组操作,如排序(
sort())、复制(copyOf())、转换为集合(asList())。
- 用于数组操作,如排序(
-
迭代器相关接口:
- Iterator:通用迭代器,支持元素删除。
- ListIterator:List 特有的双向迭代器。
五、集合框架的设计思想与扩展点
-
设计模式应用:
- 工厂模式:通过
Collections工具类创建集合实例(如emptyList())。 - 迭代器模式:通过
Iterator接口分离集合遍历逻辑。 - 适配器模式:
Arrays.asList()将数组适配为 List 接口。
- 工厂模式:通过
-
JDK 版本演进优化:
- JDK8:引入
Stream API,支持集合的函数式编程和并行处理。 - JDK9:新增
List.of()、Map.of()等工厂方法,创建不可变集合更便捷。
- JDK8:引入
-
并发集合扩展:
java.util.concurrent包中的ConcurrentHashMap、CopyOnWriteArrayList等,通过锁优化(分段锁、CAS)提升并发性能。
六、总结与场景选型建议
Java 集合框架通过接口分层设计,将数据结构与算法解耦,使我们可根据场景选择合适的实现:
- 若需高频随机访问,选
ArrayList;若需高频插入删除,选LinkedList。 - 若需线程安全且高性能,选
ConcurrentHashMap而非HashTable。 - 若需有序性,选
TreeSet/TreeMap(排序需求)或LinkedHashSet/LinkedHashMap(插入顺序需求)。