增强for循环是Iterator的语法糖,可安全替代手动Iterator遍历,但遍历时删除元素、单独调用hasNext()、peek操作或自定义迭代逻辑时不可替换。

增强 for 循环(for-each)本质上就是对 Iterator 的语法糖封装,它自动获取集合的迭代器、调用 hasNext() 和 next(),所以大多数只读遍历场景下,可以直接用增强 for 替代手动写 Iterator。
什么时候能直接替换?
只要不涉及以下操作,增强 for 就能安全替代原始 Iterator:
- 遍历时需要删除元素(
iterator.remove()) - 需要在循环中判断是否还有下一个元素但暂不取值(
hasNext()单独调用) - 需要跳过当前元素或重复取当前元素(比如 peek 操作)
- 使用的是自定义迭代逻辑(如双向迭代、分页迭代等)
基础替换写法示例
原始 Iterator 写法:
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
></code></pre>
等价的增强 for 写法:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
for (String s : list) {
System.out.println(s);
></code></pre>
编译后,这两段代码生成的字节码非常接近——JVM 会为增强 for 自动插入 iterator()、hasNext()、next() 调用。
不能替换时的替代方案
如果要在遍历中删除元素,增强 for 会抛 ConcurrentModificationException。此时必须用 Iterator:
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if ("b".equals(it.next())) {
it.remove(); // 安全删除
}
></code></pre>
若坚持用 for-each,可先收集待删元素,再统一移除:
<pre><code>// ⚠️ 曲线救国:两步走List<String> toRemove = new ArrayList<>();
for (String s : list) {
if ("b".equals(s)) {
toRemove.add(s);
}
}
list.removeAll(toRemove);
></code></pre>
注意:这适用于小数据量;大数据量或需即时响应的场景,仍推荐原生 Iterator。
增强 for 的限制与注意事项
增强 for 隐式依赖 Iterable 接口,因此只能用于实现了该接口的对象(如 Collection 子类、数组、自定义 Iterable 类):
- 数组支持:
for (int i : intArray) - Map 不直接支持,但可用
map.keySet()、map.values()或map.entrySet() - 无法获取当前索引,如需索引,请用传统 for 循环或配合
IntStream.range()

















