应复用已创建的Iterator对象,避免循环中反复调用collection.iterator();Iterator非线程安全、不可重置,但单次遍历中可多次调用hasNext()和next()。

直接复用已创建的 Iterator 对象,而不是在循环中反复调用 collection.iterator()。这是最有效、最直接的方式。
明确 Iterator 的生命周期范围
Iterator 不是线程安全的,也不支持重复使用(一旦遍历完成或抛出异常,通常不可重置),但它可以在单次遍历任务中被多次调用 hasNext() 和 next() —— 关键是别在每次循环开始时都新建一个。
- ❌ 错误写法(每次循环都新建):
for (int i = 0; i < 10; i++) {<br> Iterator<String> it = list.iterator(); // 每次都 new 一个!<br> while (it.hasNext()) { ... }<br>}
- ✅ 正确做法:把 Iterator 提前创建好,在需要的地方复用(只要没遍历完);如果需多次完整遍历,也应考虑是否真需要 Iterator,还是改用索引或 foreach 更合适。
优先用增强 for 循环(for-each),但注意场景
增强 for 循环底层仍会创建 Iterator,但它由编译器自动管理,代码简洁且不易出错。不过它隐藏了迭代器对象,无法手动调用 remove(),也不适合边遍历边删除的场景。
立即学习“Java免费学习笔记(深入)”;
- 适合读取为主、不修改集合的场景;
- 若需安全删除元素,必须显式使用 Iterator 并调用其
remove()方法; - 若性能极其敏感(如高频内层循环),且集合类型确定(如 ArrayList),可考虑传统 for + 索引访问,避免任何 Iterator 开销。
避免在循环体内重复获取 Iterator
常见误区是把 iterator() 放在 while 或 for 条件中,导致每次判断都新建对象:
- ❌ 危险写法:
while (list.iterator().hasNext()) { ... } —— 每次都创建新 Iterator,还立即丢弃。
- ✅ 应改为:
Iterator<String> it = list.iterator();<br>while (it.hasNext()) { ... }
注意 Fail-Fast 机制带来的隐性成本
每次新建 Iterator 都会拷贝当前集合的 modCount 值作为 expectedModCount。虽然单次开销小,但在高频调用或大数据量遍历时,对象分配+字段赋值+后续校验会累积成可观的 GC 和 CPU 压力。
- 尤其在自定义集合或包装类中,
iterator()实现可能更重,务必查看源码确认; - 若集合内容不变,且需多次遍历,可考虑提前转为数组(
list.toArray()),用纯索引循环,彻底绕过 Iterator。



















