Iterator 旨在保障遍历与修改的安全性而非追求极致性能;增强 for 循环是首选,简洁高效且无额外开销;应避免在循环条件中重复调用方法。

Iterator 本身不是为“高性能”而设计的替代方案,而是为“安全遍历 + 安全修改”服务的抽象机制。它在多数场景下性能略低于直接索引访问(如 ArrayList.get(i)),但比链表类集合(如 LinkedList)的随机访问快得多。所谓“高性能要求下替代普通循环”,关键不在盲目替换,而在选对方式、避开陷阱、用对时机。
优先用增强 for 循环(底层仍是 Iterator)
绝大多数集合遍历场景,应直接使用增强 for 循环:
- 语法简洁,可读性高,编译器自动转为标准 Iterator 模式,无额外开销
- 避免手动调用
hasNext()和next()的冗余代码,减少出错可能 - 对
ArrayList、HashSet等主流集合,性能与手写 Iterator 几乎一致
示例:
for (String s : list) { process(s); }避免在循环条件中重复调用方法
普通 for 循环若写成 for (int i = 0; i ,每次迭代都执行 size() —— 虽然 ArrayList.size() 是 O(1),但 JIT 未必能完全优化;更危险的是自定义集合或带逻辑的 size() 方法。
Iterator 方式天然规避该问题:一次获取迭代器后,内部状态由游标维护,无需反复查长度。
对比:
- ❌ 低效传统循环:
for (int i = 0; i - ✅ Iterator/增强 for:
for (T t : expensiveCollection) { ... }(只调一次iterator())
遍历时需删除元素?必须用 Iterator.remove()
这是 Iterator 不可替代的核心价值。普通循环中直接调 list.remove(obj) 或 list.remove(i),会触发 ConcurrentModificationException(fail-fast 机制)。
Iterator 的 remove() 是唯一安全的遍历中删除方式,且时间复杂度可控(如 ArrayList 中为 O(n),LinkedList 中为 O(1))。
正确写法:
Iteratorwhile (it.hasNext()) {
String s = it.next();
if (s.startsWith("tmp")) it.remove();
}
极端性能敏感场景:按集合类型区别对待
并非所有集合都适合统一用 Iterator:
-
ArrayList / 数组:若只需读取、无需删除,且需要索引或跳过某些位置,传统 for + 缓存
size()可能略快(微秒级差异,通常可忽略) -
LinkedList / LinkedHashSet:绝对禁用
get(i)随机访问(O(n)),必须用 Iterator 或增强 for(O(1) 游标移动) - 并发集合(如 CopyOnWriteArrayList):其 Iterator 是快照式,不抛 CME,但遍历的是创建时的副本——适合读多写少,不追求实时一致性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











