一、Java 集合框架全景概览
Java 集合框架以 Collection 和 Map 为两大核心接口展开,Collection 专注于元素的集合操作(如 List、Set、Queue),Map 专注于键值对的映射关系。先来看一张全景图,建立整体认知:
二、List 接口:ArrayList、LinkedList、Vector 三兄弟的 “爱恨情仇”
1. ArrayList:动态数组的 “速度担当”
- 底层实现:基于动态数组(数组扩容 + 元素拷贝)。
- 核心特性:
- 随机查询快(
get(index)时间复杂度 O (1)); - 插入、删除慢(需要移动元素,时间复杂度 O (n));
- 随机查询快(
- 扩容机制:初始容量 10,扩容时新容量为原容量的 1.5 倍,通过
Arrays.copyOf()实现数组拷贝。
2. LinkedList:双向链表的 “灵活选手”
- 底层实现:基于双向链表(每个节点含
prev、next指针)。 - 核心特性:
- 随机查询慢(需遍历链表,时间复杂度 O (n));
- 插入、删除快(只需修改指针,时间复杂度 O (1));
- 额外能力:同时实现
Queue和Deque接口,可作为 ** 队列(FIFO)或栈(LIFO)** 使用。
3. Vector:线程安全的 “老派选手”
- 底层实现:基于动态数组,与 ArrayList 结构类似。
- 线程安全实现:所有公有方法加
synchronized修饰(方法级同步),保证单个方法的原子性。 - 缺点:同步粒度粗,性能差;复合操作(如 “检查后删除”)仍需手动加锁。
4. 三者核心区别对比
| 特性 | ArrayList | LinkedList | Vector |
|---|---|---|---|
| 底层结构 | 动态数组 | 双向链表 | 动态数组 |
| 随机访问 | O (1) 快 | O (n) 慢 | O (1) 快 |
| 插入 / 删除 | O (n) 慢 | O (1) 快 | O (n) 慢 |
| 线程安全 | 不安全 | 不安全 | 安全(方法同步) |
| 扩容机制 | 1.5 倍 | 无(链表无需扩容) | 2 倍 |
三、Set 接口:元素去重的 “守卫者”
Set 接口的核心是 “元素不重复”,常用实现类有 HashSet、LinkedHashSet、TreeSet。
1. HashSet:哈希表的 “去重先锋”
- 底层实现:基于
HashMap(以元素为 key,PRESENT为固定 value)。 - 特性:元素无序,不允许重复,允许
null元素。 - 去重原理:通过
hashCode()和equals()方法判断元素是否重复(先比较哈希码,再比较内容)。
2. LinkedHashSet:有序的 “哈希表 + 链表”
- 底层实现:基于
LinkedHashMap,在哈希表基础上维护了一条双向链表。 - 特性:元素有序(插入顺序),不允许重复,允许
null元素。 - 应用场景:需要 “去重且保留插入顺序” 的场景(如缓存淘汰策略)。
3. TreeSet:红黑树的 “有序守卫”
- 底层实现:基于
TreeMap(红黑树结构)。 - 特性:元素有序(自然顺序或比较器顺序),不允许重复,不允许
null元素(会破坏排序规则)。 - 排序原理:元素需实现
Comparable接口,或在创建时指定Comparator。
四、Map 接口:键值对的 “映射大师”
Map 接口处理 “键值对” 映射关系,核心实现类有 HashMap、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap。
1. HashMap:哈希表的 “性能王者”
- 底层实现:数组 + 链表 + 红黑树(JDK 8 后优化)。
- 当链表长度 > 8 且数组容量 > 64 时,链表转为红黑树;
- 当红黑树节点数 < 6 时,红黑树转回链表。
- 哈希碰撞解决:通过 “链表法”(JDK 7 及之前)和 “链表 + 红黑树”(JDK 8+)解决。
- 扩容机制:初始容量 16,负载因子 0.75;扩容时新容量为原容量的 2 倍,需重新哈希所有元素。
- 特性:无序,允许
null键(仅一个)和null值,线程不安全。
2. Hashtable:线程安全的 “老派映射”
- 底层实现:数组 + 链表(无红黑树优化)。
- 线程安全实现:所有公有方法加
synchronized修饰(同步粒度为整个对象)。 - 缺点:性能差,不允许
null键和null值,已被ConcurrentHashMap替代。
3. TreeMap:红黑树的 “有序映射”
- 底层实现:基于红黑树。
- 特性:键有序(自然顺序或比较器顺序),不允许
null键(破坏排序),允许null值,线程不安全。
4. LinkedHashMap:有序的 “哈希表 + 链表”
- 底层实现:基于
HashMap,额外维护一条双向链表记录插入顺序或访问顺序。 - 特性:键有序(插入顺序或访问顺序),允许
null键和null值,线程不安全。 - 应用场景:LRU 缓存(通过访问顺序实现)。
5. ConcurrentHashMap:线程安全的 “现代哈希表”
- JDK 7 vs JDK 8 区别:
- JDK 7:分段锁(
Segment数组),每个 Segment 是一个小 HashMap,锁粒度为 Segment。 - JDK 8: CAS + synchronized 锁(锁粒度为数组节点),结构与 HashMap 一致(数组 + 链表 + 红黑树)。
- JDK 7:分段锁(
- 特性:线程安全,性能优于 Hashtable;不允许
null键和null值。
6. HashMap vs Hashtable 核心区别
| 特性 | HashMap | Hashtable |
|---|---|---|
| 线程安全 | 不安全 | 安全(方法同步) |
| null 支持 | 允许 null 键值 | 不允许 |
| 底层结构 | 数组 + 链表 + 红黑树 | 数组 + 链表 |
| 扩容机制 | 2 倍 | 2 倍 |
| 迭代器 | fail-fast | fail-safe |
6209

被折叠的 条评论
为什么被折叠?



