iterator 可避免并发修改异常并提升代码可读性;传统 for 循环直接操作索引易导致 concurrentmodificationexception,且不适用于所有集合类型。

用 Iterator 替代传统 for (int i = 0; i 循环,核心在于避免手动维护索引、提升安全性(尤其在遍历时修改集合),并让代码更贴近“遍历意图”。它不是单纯为了“优雅”,而是为了解耦访问逻辑与数据结构细节。
用增强 for 循环(for-each)是最常用且推荐的替代方式
绝大多数场景下,不需要显式写 Iterator。Java 的增强 for 循环底层就是基于 Iterator 实现的,语法简洁、安全、可读性强:
- 自动调用
hasNext()和next(),无需手写条件判断和索引递增 - 编译期就禁止在循环体内直接调用
list.remove(i)这类破坏结构的操作,避免ConcurrentModificationException - 对所有实现了
Iterable的集合(List、Set、Map.keySet()等)都适用
示例:
for (String item : list) {
System.out.println(item);
}
必须显式使用 Iterator 的典型场景:边遍历边删除
当需要根据元素内容动态决定是否移除时,Iterator.remove() 是唯一安全的方式。增强 for 循环无法做到这点,传统 fori 循环则极易出错(如漏删、越界、跳过元素)。
正确写法:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
if ("toRemove".equals(item)) {
it.remove(); // 安全删除,不会抛 ConcurrentModificationException
}
}</string>
⚠️ 注意:it.remove() 只能紧跟在一次 next() 后调用,且只能调用一次。
需要访问索引?优先考虑其他方式,而非退回 fori
如果业务逻辑确实依赖当前下标(比如日志打点、构建带序号的字符串),不建议为索引而放弃 Iterator 的优势。可以:
- 用增强 for 循环配合外部计数器(简单清晰):
int index = 0; for (String s : list) { ... index++; } - 用 Java 8+ 的
IntStream.range(0, list.size())(函数式风格) - 若频繁需要索引访问,说明数据结构可能选型不当——
List支持随机访问,本就适合按索引操作;此时传统 fori 并非错误,只是需确保不并发修改
泛型 Iterator 让类型安全更自然
声明 Iterator<string> it = list.iterator();</string> 后,it.next() 直接返回 String,无需强制转型。这比传统 fori 中 list.get(i) 返回 Object 再强转更安全、更简洁,也消除了潜在的 ClassCastException。
现代 Java 开发中,只要不涉及索引计算或随机跳转,Iterator(或其语法糖 for-each)就是比传统 fori 更自然、更健壮的选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










