Iterator 是 Java 中安全遍历并修改集合的唯一规范方式,可避免 ConcurrentModificationException;必须在 next() 后调用 remove(),且仅支持一次 remove 后需再次 next();while (it.hasNext()) 结构更通用、安全、语义清晰。

用 Iterator 遍历集合是 Java 中更安全、规范且符合开闭原则的做法,尤其在需要边遍历边修改集合时,它能避免 ConcurrentModificationException,也比传统 for 循环或增强 for 更具语义清晰性和可维护性。
Iterator 是唯一支持安全删除的遍历方式
增强 for 循环(for-each)底层仍用 Iterator,但它隐藏了迭代器对象,无法调用 remove()。若在遍历时用 collection.remove(),会触发快速失败机制,抛出异常。
- ✅ 正确:用
iterator.remove()删除当前元素 - ❌ 错误:在 for-each 中直接调用
list.remove(obj)
示例:
ListIterator
while (it.hasNext()) {
String s = it.next();
if ("b".equals(s)) it.remove(); // 安全删除
}
显式使用 Iterator 提升代码可读性与意图表达
当逻辑涉及“逐个检查并可能跳过/终止/重置”时,显式声明 Iterator 比 for-each 更明确地传达开发者意图。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- 看到
Iterator<t> it = coll.iterator()</t>就知道后续可能有状态控制(如条件 break、多次 next、hasNext 判断) - 便于插入调试日志、计数、或与其他迭代逻辑组合(如双指针遍历两个集合)
配合泛型和 while + hasNext 实现稳定遍历结构
推荐统一使用 while (it.hasNext()) 结构,而非 for (int i = 0; i ,因为:
- 不依赖索引,适配所有
Collection子类(包括无序、不可随机访问的 Set、Queue) - 避免因集合大小动态变化导致的
IndexOutOfBoundsException - 天然屏蔽底层实现细节,符合面向接口编程思想
注意 remove() 的调用约束
Iterator.remove() 必须紧跟在一次 next() 之后调用,否则抛 IllegalStateException。
- 不能在未调用 next() 时 remove
- 不能连续调用两次 remove(中间无 next)
- 部分集合(如
Collections.unmodifiableXXX)的迭代器不支持 remove,调用会抛UnsupportedOperationException

















