for-each循环是Iterator遍历的简洁替代,自动调用hasNext()和next(),适用于Iterable集合和数组;仅支持正向只读遍历,不可修改结构或直接获取索引。

Java 中 for-each 循环(增强型 for 循环)是传统 Iterator 显式遍历的简洁替代方案,适用于所有实现了 Iterable 接口的集合(如 ArrayList、HashSet、LinkedList)以及数组。
for-each 循环的基本语法
格式为:for (元素类型 变量名 : 集合或数组)。它自动获取迭代器并调用 hasNext() 和 next(),无需手动管理。
- 只能正向遍历,不支持修改集合结构(如删除、添加元素)
- 无法直接访问当前索引(需额外计数变量)
- 不能跳过元素或控制迭代步长
对比传统 Iterator 写法
以下是对 List<String> 遍历的两种写法对比:
传统 Iterator:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
System.out.println(item);
}
for-each 替代:
for (String item : list) {
System.out.println(item);
}
代码更短、意图更清晰,且避免了 ConcurrentModificationException 的误用风险(虽然 for-each 在遍历时仍会检测结构性修改)。
适用场景与注意事项
for-each 适合「只读遍历」场景,比如打印、求和、查找匹配项等。
- 需要在遍历时删除元素?→ 必须用
Iterator.remove(),for-each 会抛ConcurrentModificationException - 需要知道当前下标?→ 改用传统 for 循环(
for (int i = 0; i < list.size(); i++))或配合局部计数器 - 遍历多维数组?→ 可嵌套使用:
for (int[] row : matrix) { for (int val : row) { ... } }
底层原理简述
编译器会将 for-each 编译为等效的 Iterator 代码。例如 for (String s : list) 实际生成的字节码与显式使用 list.iterator() 几乎一致——只是由编译器自动完成,对开发者透明。
这意味着性能无差异,但可读性和安全性更高。

















