Java中Iterator通过collection.iterator()获取,提供hasNext()、next()、remove()方法实现安全遍历;增强for循环是其语法糖,但无法删除元素。

Java 中 Iterator 是集合遍历的标准方式,它提供统一、安全的遍历接口,避免在遍历时直接操作集合结构引发 ConcurrentModificationException。
如何获取 Iterator 对象
所有实现了 Collection 接口的集合类(如 ArrayList、LinkedList、HashSet 等)都提供 iterator() 方法,返回一个 Iterator 实例:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));Iterator<String> it = list.iterator();
注意:数组不是集合,不能直接调用 iterator();若需迭代数组,可先转为 List(如 Arrays.asList(arr))或使用增强 for 循环 / Stream。
Iterator 的核心方法与遍历逻辑
Iterator 提供三个关键方法,配合 while 循环完成安全遍历:
立即学习“Java免费学习笔记(深入)”;
-
hasNext():判断是否还有下一个元素,返回boolean -
next():返回下一个元素,并将内部游标前移;若已无元素会抛出NoSuchElementException -
remove()(可选):删除上一次next()返回的元素;必须在next()之后调用,且每个next()最多只能调用一次remove()
典型遍历写法:
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
System.out.println(item);
// it.remove(); // 如需边遍历边删除,放在这里
}
遍历时删除元素的正确姿势
直接用 list.remove(obj) 或按索引删除(如 list.remove(i))在迭代中极易导致异常或漏删。必须使用 Iterator.remove():
- 错误示例:
for (String s : list) { if (s.equals("b")) list.remove(s); }→ 可能抛异常或跳过元素 - 正确示例:
while (it.hasNext()) { if ("b".equals(it.next())) it.remove(); }
该机制通过维护“预期修改次数”(expectedModCount)校验并发修改,确保线程(单线程下指逻辑)安全。
Iterator 与增强 for 循环的关系
增强 for 循环(for (Type t : collection))本质就是编译器自动展开为 Iterator 遍历。它简洁易读,但隐藏了底层细节:
- 支持所有实现了
Iterable接口的类型(包括集合和自定义类) - 无法在遍历时调用
remove()—— 因为没有暴露 Iterator 引用 - 如需删除,仍应回退到显式 Iterator 写法
所以,需要控制遍历过程(如条件删除、跳过、计数)时,优先用显式 Iterator;仅读取时,增强 for 更简洁。


















