Iterator比索引更合适,因其解耦遍历与集合实现,支持安全删除(iterator.remove()),避免ConcurrentModificationException,并适配所有集合类型(如LinkedList、HashSet),而索引遍历仅适用于可随机访问的List且性能差(如LinkedList中get(i)为O(n))。

用 Iterator 替代索引遍历集合,核心是放弃用 get(i) 或数组下标访问元素,改用“边移动边取值”的方式——这更安全、更通用,尤其适合非随机访问的集合(如 LinkedList、HashSet)。
为什么 Iterator 比索引更合适?
索引遍历(for (int i = 0; i )只对 <code>List 且支持随机访问(如 ArrayList)高效;而 LinkedList 用索引查第 n 个元素需从头遍历,时间复杂度是 O(n),整体变成 O(n²)。Iterator 则统一以 O(1) 的代价获取下一个元素,与底层实现解耦。
标准 Iterator 遍历写法
适用于所有 Collection 子类(List、Set、Queue 等):
- 调用
collection.iterator()获取迭代器 - 用
hasNext()判断是否还有元素 - 用
next()取出当前元素并自动推进指针
示例:
立即学习“Java免费学习笔记(深入)”;
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
System.out.println(item);
}
增强 for 循环本质就是 Iterator
写 for (String s : list) 看似简洁,编译后实际等价于上面的手动 Iterator 写法。它隐式使用了迭代器,所以同样具备安全性和通用性,且代码更干净。但注意:无法在遍历中修改集合结构(如删除),否则会抛 ConcurrentModificationException。
需要边遍历边删除?用 Iterator.remove()
普通 for 循环中调用 list.remove(i) 会导致索引错位或漏删;而 Iterator 提供了安全的 remove() 方法,只能在调用过 next() 后立即使用:
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.startsWith("A")) {
it.remove(); // 安全删除当前元素
}
}
这是唯一推荐的遍历中删除方式,避免并发修改异常,也不影响后续遍历逻辑。
不复杂但容易忽略


















