03 — 集合框架索引
定位: Java 最核心的 API 体系之一 — 数据结构的接口/实现分离设计 面试高频度: ⭐⭐⭐⭐⭐
一、板块在体系中的位置
┌─────────────────────────────────────────────────────────────┐
│ 集合框架在 Java 中的角色 │
│ │
│ 02-面向对象核心 (接口/实现分离的设计哲学) │
│ │ │
│ ▼ │
│ 03-集合框架 ← 在这里 │
│ Collection / Map 两大分支 → 日常开发最高频使用的 API │
│ │ │
│ ├──→ 04-泛型 (集合大量使用泛型 — 类型安全的容器) │
│ ├──→ 07-Lambda/Stream (集合的批量操作) │
│ └──→ 08-多线程/并发 (并发集合—ConcurrentHashMap/...) │
└─────────────────────────────────────────────────────────────┘二、知识全景图
┌─────────────────────────────────────────────────────────────┐
│ Java 集合框架全景图 │
│ │
│ ┌── Iterable ──┐ │
│ │ │ │
│ Collection │ │
│ ┌──────┼──────┐ │ │
│ │ │ │ │ │
│ List Set Queue Map (独立体系) │
│ │ │ │ │ │
│ ┌── ArrayList HashSet Deque HashMap │
│ ├── LinkedList Linked ArrayD LinkedHashMap │
│ └── Vector TreeSet PriQue TreeMap │
│ │
│ ┌──── 并发集合 ────────────────────────────────────┐ │
│ │ CopyOnWriteArrayList ConcurrentLinkedQueue │ │
│ │ ConcurrentHashMap BlockingQueue (各种) │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ 核心考点: │
│ ① HashMap 数据结构 + put/get 流程 + 扩容 + 红黑树 │
│ ② ConcurrentHashMap 线程安全实现 (JDK7→8 演进) │
│ ③ ArrayList vs LinkedList 选择 │
│ ④ Comparable vs Comparator 排序 │
└─────────────────────────────────────────────────────────────┘三、子专题导航
| # | 主题 | 面试频率 | 核心内容 |
|---|---|---|---|
| **List体系** | List体系 | ⭐⭐⭐⭐ | ArrayList/LinkedList 数据结构对比、扩容机制、随机访问 vs 顺序访问 |
| **HashMap核心原理** | HashMap核心原理 | ⭐⭐⭐⭐⭐ | 哈希表设计动机、put/get 全流程、扩容树化、hash 扰动 |
| **ConcurrentHashMap** | ConcurrentHashMap | ⭐⭐⭐⭐⭐ | 分段锁→CAS+synchronized 演进、并发安全读写 |
| **Set与Queue** | Set与Queue | ⭐⭐⭐ | HashSet 去重原理、TreeSet 排序、Queue 各实现对比 |
四、核心考点速记
考点 1:HashMap put 流程(JDK 8)
put(key, value)
│
├── hash(key) → 扰动函数 (高16位 ^ 低16位)
│
├── (n-1) & hash → 计算桶位置
│
├── 桶为空 → 直接放入
│
├── 桶不为空 → 判断 key 是否 equals
│ ├── 相等 → 替换 value
│ └── 不等 → 链表遍历 / 红黑树查找
│
└── 元素数 > 阈值(8) → 链表树化(红黑树)
⚠️ 扩容触发:size > capacity * loadFactor(0.75)
扩容为 2 倍 → 元素重新散列考点 2:ArrayList vs LinkedList
| 维度 | ArrayList | LinkedList |
|---|---|---|
| 底层结构 | 动态数组 | 双向链表 |
| 随机访问 get(i) | O(1) | O(n) |
| 尾部插入 | O(1) 均摊 | O(1) |
| 中间插入/删除 | O(n) 移动元素 | O(1) 改指针 |
| 内存 | 连续紧凑 | 每个节点额外存前后指针 |
| 适用场景 | 查询多、尾部追加 | 频繁头尾插入删除 |
五、面试高频追问一览
| 追问 | 关联笔记 | 频次 |
|---|---|---|
| HashMap 扩容为什么是 2 的幂次? | **HashMap核心原理** | ⭐⭐⭐⭐⭐ |
| 红黑树为什么比链表好?阈值为什么是 8? | **HashMap核心原理** | ⭐⭐⭐⭐⭐ |
| ConcurrentHashMap 的 size() 怎么实现的? | **ConcurrentHashMap** | ⭐⭐⭐⭐ |
| ArrayList 的扩容因子是多少? | **List体系** | ⭐⭐⭐⭐ |
📚 相关文件
- **02-OOP核心** — 集合框架的设计哲学
- **泛型注解索引** — 集合中的泛型应用
- **Lambda索引** — Stream 对集合的批量操作
- **Java文库设计文档** — 返回总纲