集合框架知识体系概览
什么是集合框架?
集合框架(Java Collections Framework, JCF) 是 Java 提供的一套用于存储和操作数据集合的标准 API。如果说数组是"固定大小的储物柜",那集合就是"可以自动伸缩、按需选择类型的智能容器"。
在实际开发中,你几乎不可能只用数组——从数据库查出一批用户要存到 List、判断用户名是否重复要用 Set、建立 ID 到对象的映射要用 Map。集合框架是 Java 开发者每天都在用的基础设施。
集合框架的整体结构
集合框架有两大根接口:
Collection:存储"一组元素",下分List(有序可重复)、Set(无序不重复)、Queue(队列)Map:存储"键值对",每个 key 唯一
核心知识点
List——有序可重复的列表
| 实现类 | 底层结构 | 随机访问 | 增删效率 | 线程安全 |
|---|---|---|---|---|
ArrayList | 动态数组 | ✅ 快 | 慢 | ❌ |
LinkedList | 双向链表 | 慢 | 快 | ❌ |
Vector | 动态数组 | ✅(已过时) | ||
CopyOnWriteArrayList | 写时复制数组 | ✅ |
ArrayList 是最常用的 List 实现——底层是 Object[] 数组,初始容量 10,扩容时增长为原来的 1.5 倍(newCapacity = oldCapacity + (oldCapacity >> 1))。面试高频问题:ArrayList 和 LinkedList 怎么选?绝大多数场景选 ArrayList——现代 CPU 的缓存机制让连续内存访问远快于链表的指针跳转。
Map——键值对映射
HashMap 是 Java 面试中出现频率最高的数据结构,没有之一。
- JDK 7:数组 + 链表(头插法,多线程下可能死循环)
- JDK 8:数组 + 链表 + 红黑树(链表长度 > 8 且数组长度 ≥ 64 时转红黑树,尾插法)
核心参数:初始容量 16、负载因子 0.75、扩容为 2 倍。put 操作的流程是:计算 key 的 hash → 定位桶位置 → 如果桶为空直接放入,不为空则遍历链表/红黑树处理冲突。
ConcurrentHashMap 是 HashMap 的线程安全版本。JDK 7 用分段锁(Segment),JDK 8 改为 CAS + synchronized 锁单个桶节点,并发度大幅提升。
Set——无重复的集合
HashSet 底层就是一个 HashMap(值固定为 PRESENT 常量),利用 HashMap 的 key 唯一性实现去重。判断"重复"依赖 hashCode() 和 equals() 方法——这也是为什么重写 equals 必须同时重写 hashCode。
Queue——队列
- PriorityQueue:基于二叉堆的优先队列,元素按优先级出队,常用于 TopK 问题
- ArrayDeque:基于循环数组的双端队列,可以用作栈(
push/pop)或队列(offer/poll),性能优于Stack和LinkedList - BlockingQueue:阻塞队列(
ArrayBlockingQueue、LinkedBlockingQueue),线程池的核心组件
Stream API——函数式集合操作
Java 8 引入的 Stream API 提供了声明式的集合处理方式,支持 filter、map、reduce、collect 等操作,类似 JavaScript 的数组高阶函数:
// 筛选年龄 > 18 的用户名,按字母排序
List<String> names = users.stream()
.filter(u -> u.getAge() > 18)
.map(User::getName)
.sorted()
.collect(Collectors.toList());
Stream 还支持并行流(Parallel Stream)——自动利用多核 CPU 并行处理,但要注意线程安全和性能开销。
面试重点总结
| 问题 | 关键点 |
|---|---|
| HashMap 底层原理 | 数组+链表+红黑树、put 流程、扩容机制、hash 计算 |
| HashMap vs Hashtable | Hashtable 线程安全但已过时,用 ConcurrentHashMap |
| ArrayList vs LinkedList | ArrayList 几乎总是更好的选择(CPU 缓存友好) |
| HashMap 线程不安全的表现 | JDK 7 死循环、JDK 8 数据丢失和 size 不准确 |
| ConcurrentHashMap 原理 | JDK 7 分段锁 vs JDK 8 CAS + synchronized |
| fail-fast vs fail-safe | 遍历时修改集合抛 ConcurrentModificationException |
学习建议
- ArrayList 源码 → 扩容机制、动态数组原理
- HashMap 源码 → Java 面试最高频知识点
- ConcurrentHashMap → 并发场景下的 Map
- TreeMap / PriorityQueue → 红黑树 / 堆的应用
- Stream API → 现代 Java 开发必备