1、集合框架体系
(1) 核心组件说明
| 组件类型 | 代表类/接口 | 功能描述 |
|---|---|---|
| 迭代器 | Iterator, ListIterator | 提供统一的遍历契约,支持 fail-fast 机制。 |
| 排序接口 | Comparable, Comparator | 定义对象的自然排序和定制排序逻辑。 |
| 工具类 | Collections | 提供集合操作的静态方法(排序、逆序、线程安全化等)。 |
(2) Collection 接口继承树
单列集合体系,主要用于存储一系列符合某种规则的元素。
graph TD
Collection(Collection 接口) --> List(List 接口: 有序/重复/索引)
Collection --> Set(Set 接口: 无序/唯一)
List --> Vector[Vector]
List --> ArrayList[ArrayList]
List --> LinkedList[LinkedList]
Set --> HashSet[HashSet]
HashSet --> LinkedHashSet[LinkedHashSet]
Set --> SortedSet(SortedSet)
SortedSet --> TreeSet[TreeSet]
(3) Map 接口继承树
双列集合体系,存储 Key-Value 映射关系。
graph TD
Map(Map 接口) --> Hashtable[Hashtable: 线程安全/不可为null]
Hashtable --> Properties[Properties: 属性配置读取]
Map --> HashMap[HashMap: 高性能/哈希表实现]
HashMap --> LinkedHashMap[LinkedHashMap: 链表记录插入顺序]
Map --> SortedMap(SortedMap 接口)
SortedMap --> TreeMap[TreeMap: 红黑树实现/按Key排序]
2、Collections API
APi行为明细:
| 分类 | 常用 API | 深度解析与重点备注 |
|---|---|---|
| 增 | add(E e), addAll(coll) | 返回值语义:返回 true 表示集合结构发生了变化。若 Set 集合已存在该元素,add 会返回 false。 |
| 判断 | size(), isEmpty(), contains(obj), containsAll(coll), equals(obj) | 核心依赖:contains 严重依赖元素的 equals() 方法。如果存入的对象没有正确重写 equals,查找将失效。 |
| 删除 | clear(), remove(obj), removeAll(coll), retainAll(coll) | 性能预警:removeAll 和 retainAll 实现的是集合求差/交集。在 ArrayList 中其复杂度为 ,处理大数据量时需慎重。 |
| 视图转换 | toArray(), toArray(T[] a) | 避坑:无参 toArray() 返回 Object[]。推荐使用带参数版本 list.toArray(new String[0]) 以获取具体类型数组并避免强转异常。 |
| 迭代 | iterator() | 唯一性:这是获取 Iterator 对象的唯一标准入口,是实现单列集合遍历的基础。 |
3、Iterator
(1) 核心接口定义
Collection 接口继承了 Iterable,这规定了所有单列集合必须具备“可迭代性”。
- Iterable 接口:
- 职责:声明实现类支持迭代。
- 核心方法:
Iterator<T> iterator(),用于获取一个全新的迭代器对象。
- Iterator 接口:
- 职责:具体的遍历执行者,通过维护内部指针(Cursor)来控制访问进度。
- 核心 API:
boolean hasNext():判断指针后方是否仍有可访问元素。E next():指针后移并返回跨过的元素。void remove():删除刚跨过 即最后一次 next 返回的元素。
(2) 迭代器执行原理 迭代器是一个一次性的“状态机”。它并不拷贝集合数据,而是直接在原集合上通过指针移动实现访问。
- 初始化:调用
iterator()时,指针(Cursor)位于第一个元素之前。 - 探测:调用
hasNext()检查后续空间。 - 移动与获取:调用
next(),指针跨过元素并将其返回。 - 安全清理:若需删除,必须在
next()之后立即执行remove()。
(3) 核心重点:Fail-Fast (快速失败) 机制
这是 JCF 架构中为了保证数据安全而设计的一致性探测机制。
- 底层变量:
modCount:定义在集合类中(如ArrayList),记录集合结构发生修改(add/remove)的总次数。被标记为transient避免序列化。expectedModCount:定义在迭代器内部,初始化时拷贝自modCount。
- 判定逻辑: 在迭代器执行 next() 或 remove() 时,会立即调用 checkForComodification() 方法:
- 关键差异(避坑):
list.remove():仅更新modCount。迭代器无法感知这一变化,导致下次next()时两者不相等,触发异常。iterator.remove():在删除元素后,会自动执行expectedModCount = modCount同步计数器,因此它是唯一安全的运行时删除方式。
(4) Iterator 与 ListIterator 归纳对比
针对 List 家族,Java 提供了更强大的子接口 ListIterator:
| 特性 | Iterator (通用) | ListIterator (List 专用) |
|---|---|---|
| 遍历方向 | 只能单向向后 | 支持双向 (hasPrevious / previous) |
| 修改能力 | 仅支持 remove | 支持 add (新增), set (修改), remove |
| 索引操作 | 不支持 | 可获取 nextIndex() 和 previousIndex() |
| 使用限制 | 所有 Collection 均可使用 | 仅限 List 体系 |