Java 集合框架核心对比知识点
[Java 集合框架核心对比知识点](#Java 集合框架核心对比知识点)
[一、List 系列对比](#一、List 系列对比)
[二、Map 系列对比](#二、Map 系列对比)
[三、Set 系列对比](#三、Set 系列对比)
一、List 系列对比
1. ArrayList vs LinkedList
| 特性 | ArrayList |
LinkedList |
|---|---|---|
| 底层结构 | 动态数组 (Object[]) |
双向链表 (Node) |
| 随机访问 | O(1) (通过索引直接定位) | O(N) (需从头/尾遍历到指定位置) |
| 头部/中部插入/删除 | O(N) (需要移动后续元素) | O(N) (需要先遍历到位置,然后修改指针) |
| 尾部插入/删除 | O(1) (摊销,扩容时 O(N)) | O(1) (已知尾节点) |
| 内存占用 | 相对紧凑,浪费少量空间 (扩容预留) | 每个节点有额外指针开销 (prev, next),内存碎片化 |
| 迭代器并发修改异常 | 支持 (fast-fail) |
支持 (fast-fail) |
| 适用场景 | 频繁查询 ,偶发随机插入/删除 | 频繁在任意位置插入/删除,查询较少 |
二、Map 系列对比
2. HashMap vs TreeMap vs LinkedHashMap
| 特性 | HashMap |
TreeMap |
LinkedHashMap |
|---|---|---|---|
| 底层实现 | 哈希表 (数组 + 链表/红黑树) | 红黑树 (自平衡二叉搜索树) | 哈希表 + 双向链表 |
| 排序 | 无序 | 有序 (按键自然排序或自定义 Comparator) |
有序 (按插入顺序,可配置为访问顺序) |
| 性能 (平均) | O(1) (查找/插入/删除) | O(log N) (查找/插入/删除) | O(1) (查找/插入/删除),略慢于 HashMap |
| Null 值 | 允许一个 null key,多个 null value |
不允许 null key (会抛 NullPointerException),允许 null value |
允许一个 null key,多个 null value |
| 功能扩展 | 基础键值对映射 | 提供范围操作 (subMap, headMap, tailMap),获取最大/最小键 |
提供访问顺序迭代,可实现 LRU 缓存 |
| 线程安全 | 否 | 否 | 否 |
| 适用场景 | 需要高性能的键值对查找 | 需要排序 或范围查找 | 需要保持插入顺序 |
三、Set 系列对比
3. HashSet vs TreeSet vs LinkedHashSet
| 特性 | HashSet |
TreeSet |
LinkedHashSet |
|---|---|---|---|
| 底层实现 | 基于 HashMap |
基于 TreeMap |
基于 LinkedHashMap |
| 排序 | 无序 | 有序 (同 TreeMap) |
有序 (按插入顺序) |
| 性能 (平均) | O(1) | O(log N) | O(1) |
| Null 值 | 允许一个 null |
不允许 null |
允许一个 null |
| 适用场景 | 高效的去重和查找 | 需要排序的去重集合 | 需要保持插入顺序的去重集合 |
四、线程安全集合对比
4. Vector vs ArrayList vs Collections.synchronizedList(ArrayList)
| 特性 | Vector |
ArrayList |
Collections.synchronizedList(ArrayList) |
|---|---|---|---|
| 线程安全 | 是 (方法级 synchronized) |
否 | 是 (方法级 synchronized) |
| 性能 | 较慢 (同步开销大) | 最快 | 较慢 (同步开销) |
| 扩容策略 | 通常是2 倍 | 通常是1.5 倍 | 同被包装的 List (这里是 ArrayList) |
| 推荐度 | 不推荐 (性能差) | 单线程首选 | 替代 Vector,但仍性能不佳 |
| 替代方案 | - | - | java.util.concurrent.CopyOnWriteArrayList (适用于读多写少场景) |
5. Hashtable vs HashMap vs ConcurrentHashMap
| 特性 | Hashtable |
HashMap |
ConcurrentHashMap |
|---|---|---|---|
| 线程安全 | 是 (方法级 synchronized) |
否 | 是 (分段锁/CAS + synchronized) |
| 性能 | 较慢 (同步开销大) | 最快 | 高并发下性能优异 |
| Null 值 | 不允许 null key 或 null value |
允许一个 null key 和多个 null value |
不允许 null key 或 null value |
| 推荐度 | 不推荐 (性能差) | 单线程首选 | 高并发场景首选 |
五、其他核心概念对比
6. 扩容机制回顾 (来自之前的讨论)
| 特性 | ArrayList |
HashMap |
|---|---|---|
| 扩容触发条件 | size >= capacity |
size >= (capacity * loadFactor) |
| 扩容比例 | 约 1.5 倍 | 2 倍 |
| 扩容后元素位置 | 不变 | 通常会改变 (重新哈希) |
| 负载因子 | 无 | 有 (默认 0.75) |
| 扩容目的 | 解决空间不足 | 解决哈希冲突过多 |
这份整理涵盖了 Java 集合框架中最核心、最容易混淆的几组对比,希望对您的学习有所帮助!