JAVASE-集合-集合体系

0 阅读2分钟

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)性能预警removeAllretainAll 实现的是集合求差/交集。在 ArrayList 中其复杂度为 O(n2)O(n^2),处理大数据量时需慎重。
视图转换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
      1. boolean hasNext():判断指针后方是否仍有可访问元素。
      2. E next():指针后移并返回跨过的元素。
      3. void remove():删除刚跨过 即最后一次 next 返回的元素。

(2) 迭代器执行原理 迭代器是一个一次性的“状态机”。它并不拷贝集合数据,而是直接在原集合上通过指针移动实现访问。

  • 初始化:调用 iterator() 时,指针(Cursor)位于第一个元素之前。
  • 探测:调用 hasNext() 检查后续空间。
  • 移动与获取:调用 next(),指针跨过元素并将其返回。
  • 安全清理:若需删除,必须在 next() 之后立即执行 remove()

(3) 核心重点:Fail-Fast (快速失败) 机制

这是 JCF 架构中为了保证数据安全而设计的一致性探测机制

  • 底层变量
    • modCount:定义在集合类中(如 ArrayList),记录集合结构发生修改(add/remove)的总次数。被标记为 transient 避免序列化。
    • expectedModCount:定义在迭代器内部,初始化时拷贝自 modCount
  • 判定逻辑: 在迭代器执行 next() 或 remove() 时,会立即调用 checkForComodification() 方法: if (modCountexpectedModCount)throw ConcurrentModificationException\text{if } (modCount \neq expectedModCount) \Rightarrow \text{throw ConcurrentModificationException}
  • 关键差异(避坑)
    1. list.remove():仅更新 modCount。迭代器无法感知这一变化,导致下次 next() 时两者不相等,触发异常。
    2. iterator.remove():在删除元素后,会自动执行 expectedModCount = modCount 同步计数器,因此它是唯一安全的运行时删除方式。

(4) Iterator 与 ListIterator 归纳对比

针对 List 家族,Java 提供了更强大的子接口 ListIterator

特性Iterator (通用)ListIterator (List 专用)
遍历方向只能单向向后支持双向 (hasPrevious / previous)
修改能力仅支持 remove支持 add (新增), set (修改), remove
索引操作不支持可获取 nextIndex() 和 previousIndex()
使用限制所有 Collection 均可使用仅限 List 体系