集合框架本质 = 数据组织结构 + 访问策略 + 约束规则
它解决三个根本问题:
| 问题 | 本质 |
|---|---|
| 数据如何组织 | 数据结构 |
| 如何访问数据 | 访问语义(顺序 / 随机 / 优先级) |
| 如何保证一致性 | 约束规则(唯一性 / 有序性 / 并发安全) |
因此:
集合不是“容器”,而是数据组织与访问策略的抽象统一接口体系
行为抽象优于实现抽象:
Collection → List / Set / Queue
Map(独立体系)
接口定义语义,不定义结构。
解耦。
典型体现:
| 抽象 | 作用 |
|---|---|
| Iterator | 统一遍历算法 |
| Comparator | 外部排序策略 |
| Comparable | 内部排序策略 |
多数实现:
Set 本质上 = Map 的包装
例:
HashSet → HashMap
TreeSet → TreeMap
集合框架大量使用委托 + 适配。
所有集合共享:
统一行为模型。
| 类型 | 访问模型 | 核心结构 |
|---|---|---|
| List | 位置索引 | 数组 / 链表 |
| Set | 唯一性约束 | 哈希 / 树 |
| Queue | 顺序消费 | 队列结构 |
| Map | 键值映射 | 哈希 / 树 |
| 结构 | 特征 | 复杂度 |
|---|---|---|
| 动态数组 | 连续内存 | 读快写慢 |
| 链表 | 非连续 | 插入快 |
| 哈希表 | 散列定位 | 平均O(1) |
| 红黑树 | 平衡排序 | O(log n) |
| 跳表 | 分层索引 | O(log n) |
| 语义 | 实现机制 |
|---|---|
| 有序 | 索引 / 树 |
| 唯一 | equals + hash |
| 优先级 | 比较器 |
| 并发安全 | 锁 / CAS |
数据单元
↓
结构组织
↓
访问策略
↓
一致性规则
所有集合操作可归约为:
查询
插入
删除
遍历
比较
本质:
Index → Element
动态扩容数组。
| 操作 | 复杂度 |
|---|---|
| get | O(1) |
| add尾部 | 均摊O(1) |
| 插入中间 | O(n) |
扩容倍率 1.5:
目标是平衡:
扩容次数
内存浪费
复制成本
这是典型:
空间换时间的渐进优化策略
双向链表。
| 优势 | 劣势 |
|---|---|
| 插入删除O(1) | 随机访问O(n) |
| 不需要连续内存 | 缓存不友好 |
| 场景 | 选择 |
|---|---|
| 高频查询 | ArrayList |
| 高频插入删除 | LinkedList |
但现实中:
绝大多数业务使用 ArrayList
因为:
Key → Value
核心能力:
数组 + 链表 + 红黑树
hash(key)
↓
桶定位
↓
冲突解决
| 方法 | 特点 |
|---|---|
| 链表 | 简单 |
| 红黑树 | 稳定性能 |
转换条件:
链表长度 ≥ 8 且容量 ≥ 64
本质:
在时间复杂度与空间成本之间动态平衡
默认 0.75。
控制:
空间利用率
冲突概率
扩容频率
本质:
Map 的 Key 集合
实现方式:
value = 固定对象
统一访问不同结构。
本质:
结构修改检测
实现:
modCount 对比
意义:
目标:
高并发
低阻塞
弱一致性
手段:
| 技术 | 作用 |
|---|---|
| 分段锁 | 降低竞争 |
| CAS | 无锁更新 |
| volatile | 可见性 |
泛型是:
类型约束机制
核心目标:
编译期安全
Producer → extends
Consumer → super
哈希表成立的前提:
相等 → 哈希相等
否则:
定位错误。
| 结构 | 查找 | 插入 |
|---|---|---|
| ArrayList | O(1) | O(n) |
| LinkedList | O(n) | O(1) |
| HashMap | O(1) | O(1) |
| TreeMap | O(log n) | O(log n) |
选择集合本质是选择:
时间复杂度
内存占用
并发模型
访问模式
是否需要Key映射?
是 → Map
否 → 是否需要唯一?
是 → Set
否 → List
再判断:
是否排序
是否并发
是否高频插入