iterator通过统一接口契约实现集合遍历抽象,所有iterable集合提供iterator()方法返回符合规范的迭代器,for-each底层调用hasnext()/next(),不同集合具体实现(如arraylist索引、linkedlist指针)对用户透明,且并发修改均抛concurrentmodificationexception。

Java 集合框架中,Iterator 是统一遍历接口的核心实现机制,它不依赖具体集合类型,而是通过抽象行为(“有没有下一个”“取下一个”“删当前”)屏蔽底层差异,让 List、Set、Queue 甚至 Map.values() 都能用同一套逻辑遍历。
统一靠接口契约,不是靠具体实现
所有集合类(如 ArrayList、HashSet、LinkedList)都实现了 Iterable 接口,该接口只定义一个方法:Iterator<e> iterator()</e>
只要返回一个符合 Iterator<e></e> 规范的对象,调用方就只需认准三个方法:
-
hasNext():不管底层是数组索引越界检查,还是链表指针是否为 null,统一返回 boolean -
next():不管数据存在 elementData[i] 还是 node.next,统一返回下一个元素 -
remove()(可选):由迭代器自身维护删除逻辑,和集合的 add/remove 方法完全解耦
for-each 循环背后就是 Iterator
你写的这段代码:
for (String s : list) { System.out.println(s); }
编译后等价于:
for (Iterator
String s = it.next();
System.out.println(s);
}
这意味着:哪怕把 list 换成 new HashSet() 或 Collections.unmodifiableList(...),只要它实现了 Iterable,for-each 就依然能跑——因为真正干活的是 Iterator,不是 for-each 语法本身。
不同集合,同一套遍历逻辑照样跑
对比两种典型实现:
-
ArrayList.iterator() 返回内部类
Itr,用cursor索引数组下标移动 -
LinkedList.iterator() 返回内部类
ListItr,用nextNode指针沿链表推进
但对使用者来说,完全不用知道这些。写一次 while(it.hasNext()) { it.next(); },就能安全遍历任意 Collection 子类——这是接口抽象 + 多态落地的直接体现。
统一还体现在错误处理的一致性
无论遍历哪种集合,只要在迭代过程中被非 Iterator 方式修改(比如边遍历边 list.add()),都会抛出 ConcurrentModificationException。这个检查逻辑封装在每个迭代器的 checkForComodification() 中,统一基于 modCount 和 expectedModCount 对比,而不是由每种集合各自实现一套检测规则。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











