Java增强for循环编译时转为Iterator遍历(集合)或索引访问(数组):集合调用iterator()一次,循环体展开为hasNext()+next();数组则生成基于下标的传统for循环。

增强 for 循环触发 Iterable.iterator()
只要对象实现了 Iterable<T> 接口(如所有标准集合类:ArrayList、HashSet、LinkedList 等),增强 for 就能工作。编译器会调用其 iterator() 方法获取一个迭代器实例。
- 例如:
for (String s : list)→ 编译器插入Iterator<String> it = list.iterator(); - 该调用发生在循环开始前,且只执行一次
循环体被重写为 hasNext() + next() 组合
每次迭代中,编译器把元素访问展开为标准迭代器模式:
- 先调用
it.hasNext()判断是否还有元素;若为 false,循环终止 - 若为 true,则调用
it.next()获取当前元素,并赋值给循环变量(如s) - 整个过程等价于:
while (it.hasNext()) { String s = it.next(); ... }
数组是特例:不走 Iterator,改用索引访问
当遍历的是普通数组(如 int[]、String[])时,增强 for 不依赖 `Iterable`,因为数组本身不是集合,也不实现该接口。此时编译器生成的是基于下标的传统 for 循环:
-
for (int x : arr)→ 底层类似for (int i = 0; i - 这种转换更轻量,无对象创建开销,也无泛型擦除影响
不能用于修改集合结构的操作
增强 for 是只读遍历语法糖,它不暴露迭代器引用,因此无法调用 remove() 或其他结构性修改方法:
立即学习“Java免费学习笔记(深入)”;
- 想边遍历边删除?必须显式使用
Iterator.remove() - 直接在增强 for 中调用
list.remove()会导致ConcurrentModificationException - 这也是为什么增强 for 虽简洁,但在需要动态修改的场景下仍需回归原始迭代器


















