Java 集合框架核心对比知识点
Java 集合框架核心对比知识点
一、List 系列对比
二、Map 系列对比
三、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 集合框架中最核心、最容易混淆的几组对比,希望对您的学习有所帮助!
所有评论(0)