Java迭代器模式通过Iterator接口统一集合遍历,核心是将遍历逻辑从集合中剥离;所有集合实现Iterable接口以支持增强for循环,遍历时需用hasNext()、next()、remove()三步安全操作。

Java 中迭代器模式通过 Iterator 接口统一了对各种集合的遍历方式,核心在于“把遍历逻辑从集合对象中剥离出来”,让客户端代码无需关心底层是 ArrayList、LinkedList 还是 HashSet,只需用一套标准方法(hasNext()、next()、remove())即可安全遍历。
所有集合都实现 Iterable 接口
Java 集合框架中的主要集合类(如 ArrayList、HashSet、LinkedHashMap 等)都实现了 Iterable<E> 接口。该接口只有一个方法:
-
Iterator<E> iterator()—— 返回一个可遍历当前集合元素的迭代器实例
这意味着只要一个类型实现了 Iterable,就能用于增强 for 循环(for (E e : collection)),而编译器会自动调用其 iterator() 方法并使用 Iterator 遍历。
统一使用 Iterator 的标准操作
拿到 Iterator 实例后,无论底层集合类型如何,都用相同三步完成安全遍历:
立即学习“Java免费学习笔记(深入)”;
- 调用
hasNext()判断是否还有下一个元素(避免NoSuchElementException) - 调用
next()获取当前元素并移动指针 - 如需删除,必须在刚调用
next()后立刻调用remove()(否则抛IllegalStateException)
示例:
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next(); // 安全获取
if ("target".equals(s)) {
it.remove(); // 安全删除(仅限当前这一个)
}
}
增强 for 循环本质就是 Iterator
写 for (String s : list) 看似简洁,背后 JVM 会自动翻译成等价的迭代器代码。它屏蔽了迭代器创建和调用细节,但依然依赖 Iterable.iterator() 和 Iterator 的契约。因此:
- 不能在增强 for 中直接修改集合结构(如
list.add()),否则触发ConcurrentModificationException - 若需边遍历边删,仍要显式获取
Iterator并用remove() - 自定义类想支持增强 for,只需实现
Iterable<T>并返回合法Iterator
注意不同集合的 Iterator 行为差异
虽然接口统一,但各集合的迭代器语义可能不同:
-
ArrayList迭代器:按插入顺序、支持快速失败(fail-fast)检测并发修改 -
LinkedList迭代器:也是按插入顺序,但内部用双向链表节点遍历 -
HashSet迭代器:顺序不保证(基于哈希桶),每次运行可能不同 -
TreeSet迭代器:按自然顺序或比较器顺序遍历(有序)
这些差异不影响调用方式,但影响遍历结果的“顺序性”和“一致性”,使用时需结合业务场景判断是否可接受。


















