java增强for循环在编译期被转为iterator遍历,要求对象实现iterable接口或为数组;底层依赖iterator()、hasnext()和next()方法,遍历时直接修改集合会触发concurrentmodificationexception。

Java 中的增强 for 循环(也叫 for-each 循环)在编译期就被编译器自动转换为基于 Iterator 的普通 for 循环,它本身不是新语法糖,而是对迭代器模式的语法简化。
编译器自动重写为 Iterator 调用
当你写下:
for (String s : list) {
System.out.println(s);
}
javac 编译器会将其等价地翻译成类似这样的代码:
for (Iterator<string> it = list.iterator(); it.hasNext(); ) {
String s = it.next();
System.out.println(s);
}</string>
也就是说,增强 for 循环的底层完全依赖于集合类实现的 iterator() 方法返回的 Iterator 对象,以及该对象的 hasNext() 和 next() 方法。
要求对象必须实现 Iterable 接口
能用增强 for 循环的对象,必须满足以下任一条件:
- 实现了
java.lang.Iterable接口(如ArrayList、HashSet、自定义集合类); - 是数组(编译器对数组做了特殊支持,虽未实现
Iterable,但也能用 for-each)。
对于 Iterable 类型,编译器会调用其 iterator() 方法获取迭代器;对于数组,则由 JVM 提供内置的遍历逻辑(本质仍是按索引顺序访问,但编译器不生成 Iterator 实例)。
不能在循环中修改集合结构
因为增强 for 循环底层使用的是 Iterator,而大多数集合的迭代器都是快速失败(fail-fast)的。如果在遍历过程中直接调用 list.remove() 或 list.add() 等结构性修改方法,迭代器检测到 modCount 变化,就会抛出 ConcurrentModificationException。
安全修改方式包括:
- 使用
Iterator.remove()(仅支持删除); - 收集待删元素,循环结束后批量处理;
- 改用传统 for 索引循环(注意下标越界和跳过问题)。
自定义类支持 for-each 的方法
让自己的类支持增强 for 循环,只需实现 Iterable 接口,并提供 iterator() 方法:
public class MyList<t> implements Iterable<t> {
private final List<t> data = new ArrayList();
@Override
public Iterator<t> iterator() {
return data.iterator(); // 复用底层 list 的迭代器
}
}</t></t></t></t>
之后就能这样用:
<code>MyList<string> mylist = new MyList();
mylist.add("a");
mylist.add("b");
for (String s : mylist) { // ✅ 编译通过,运行时调用 mylist.iterator()
System.out.println(s);
}</string></code>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











