优先选foreach,因其可读性高、语法简洁,适合纯读取场景;需删除元素、跳步或增强控制时选Iterator;性能差异微乎其微,关键看集合类型;扩展性上二者均优于for循环。

选 foreach 还是手写 Iterator,关键不在“语法新不新”,而在于你要做什么——读数据?删元素?遍历链表?还是兼容未来结构变化?三者底层逻辑其实很接近,但适用边界差异明显。
可读性:foreach 最省心,Iterator 更可控
foreach 写起来最干净,一行搞定:for (String s : list)。没有索引变量、没有 hasNext 判断、没有 next() 调用,新手一眼看懂,嵌套多层时也不容易乱。适合纯读取、逻辑简单的场景。
Iterator 需要显式声明、调用 hasNext 和 next,代码略长,但每一步都由你掌控。比如想跳过前两个元素、遇到特定值就 break、或者在循环中做条件判断再决定是否继续,它更直白、不易出错。
- 需要中途退出或跳步 → Iterator 更清晰
- 只遍历并处理每个元素 → foreach 更直观
- 团队协作或维护性优先 → foreach 减少理解成本
性能:看集合类型,不是看写法
foreach 和手写 Iterator 在字节码层面几乎等价——编译器会把 foreach 自动转成 Iterator 调用。所以它们的性能差异微乎其微(通常在 5% 以内),真正影响速度的是集合本身。
ArrayList 是数组实现,for 循环(索引访问)最快,因为 get(i) 是 O(1);而 LinkedList 是链表,foreach 和 Iterator 更快,因为每次 get(i) 都得从头遍历,O(n) 成本叠加后变成 O(n²)。
- ArrayList:for ≈ Iterator ≈ foreach(for 略优)
- LinkedList:Iterator ≈ foreach ≫ for(for 可能慢 10 倍以上)
- HashSet / TreeSet:三者无实质差别,都走迭代器路径
安全性:边遍历边删,只能靠 Iterator.remove()
在遍历过程中修改集合内容,是常见陷阱。foreach 和普通 for 循环里直接调用 list.remove(),都会触发 ConcurrentModificationException。只有 Iterator 提供了安全删除入口:
iterator.remove() 是唯一被设计用来在遍历时删除当前元素的方法,它会同步更新内部 modCount,避免校验失败。
- 需要删除满足条件的元素 → 必须用 Iterator
- 只是过滤或统计 → foreach 或 for 都可以
- 误用 list.remove() 在 foreach 中 → 运行时报错,且不易定位
扩展性:Iterator 更适应结构变化
如果某天 list 换成 Queue、Deque,甚至自定义集合,只要它实现了 Iterable 接口,foreach 和 Iterator 都能照常工作。但 for 循环依赖 get(i),一旦换成不支持随机访问的结构(比如 LinkedList、PriorityQueue),代码就得重写。
Iterator 是面向接口编程的体现——你操作的是“能迭代的东西”,而不是“能按索引取的东西”。这对长期维护和抽象封装更有利。
- 集合类型可能变动 → Iterator 或 foreach 更稳妥
- 明确锁定为 ArrayList 且追求极致性能 → for 循环可考虑
- 写工具类或通用方法 → 优先用 Iterator,语义更准确


















