一、Iterator 的本质:解耦遍历与结构
作为迭代器模式的核心实现,Java Iterator 接口 (java.util.Iterator) 将遍历逻辑与底层数据结构分离。集合只需暴露 iterator() 方法,无需关心调用方如何遍历元素。
核心方法:
boolean hasNext():检查是否还有元素E next():返回下一元素(指针后移)void remove():删除最后访问的元素(可选实现)
// 基础遍历示例
List<String> fruits = Arrays.asList("Apple", "Banana", "Orange");
Iterator<String> iter = fruits.iterator();
while (iter.hasNext()) {
String fruit = iter.next(); // 获取当前元素并移动指针
System.out.println(fruit);
}
二、为何选择 Iterator?关键优势解析
- 统一访问接口:无论
ArrayList、HashSet或自定义集合,调用iterator()即可用相同方式遍历。 - 安全删除元素:
for循环中直接删除易引发ConcurrentModificationException或逻辑错误,Iterator.remove()是安全方案:
// 安全删除示例:移除所有 "Banana"
Iterator<String> iter = fruits.iterator();
while (iter.hasNext()) {
if ("Banana".equals(iter.next())) {
iter.remove(); // ✅ 安全操作
}
}
- Fail-Fast 保护:多数集合的迭代器检测并发修改。遍历中若集合被其他线程(或自身非迭代器操作)修改,立即抛出
ConcurrentModificationException:
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3));
Iterator<Integer> iter = numbers.iterator();
iter.next(); // 指向1
numbers.add(4); // 修改原始集合
iter.next(); // ❌ 抛出 ConcurrentModificationException
三、实战注意事项
- 不可逆性:
Iterator单向移动,无法回头或重置(除新建迭代器)。 remove()前置条件:必须在next()后调用,且一次next()仅能调用一次remove()。- 并发场景:需用
ConcurrentHashMap或CopyOnWriteArrayList等线程安全容器的迭代器。
结语:优雅遍历的基石
Iterator 不仅是遍历工具,更是设计模式思想的典范。它通过最小化耦合,赋予开发者安全、灵活操作集合的能力。掌握其原理与技巧,能有效规避并发陷阱,写出更健壮的 Java 代码。在 forEach 和 Stream API 盛行的今天,理解迭代器底层逻辑仍是进阶之路的关键一步。
Java Iterator:解锁集合遍历力量

被折叠的 条评论
为什么被折叠?



