增强型for循环是iterator的语法糖,编译器将其转为iterator()、hasnext()、next()三步调用;数组除外,由编译器特殊处理为索引遍历。

增强型 for 循环(for-each)在 Java 中看起来简洁,但它背后并没有魔法——它只是编译器帮你自动展开的一套固定逻辑,而这个逻辑的核心就是 Iterator。
for-each 本质是 Iterator 的语法糖
当你写:
List<string> list = List.of("a", "b", "c");
for (String s : list) {
System.out.println(s);
}</string>
编译器在编译阶段就把它重写为:
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}</string>
也就是说,for-each 不是新机制,而是对 Iterator 使用模式的自动封装。它省去了手动声明迭代器、反复调用 hasNext() 和 next() 的模板代码,但所有行为仍由 Iterator 接口方法驱动。
必须实现 Iterable 才能用 for-each
编译器只允许对两类目标使用 for-each:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 数组(int[]、String[] 等):走索引路径,不依赖 Iterator
- 实现了 Iterable
接口的对象:必须提供 iterator()方法,返回一个 Iterator 实例
例如 ArrayList、HashSet、LinkedList 都实现了 Iterable,所以天然支持 for-each;而你自己写的类如果想被 for-each 遍历,就必须:
- 声明
implements Iterable<yourtype></yourtype> - 重写
public Iterator<yourtype> iterator()</yourtype>方法 - 该方法每次调用都应返回一个“干净”的新迭代器实例(不能复用或返回 this)
底层三步操作不可跳过
无论你写得多简单,for-each 在运行时始终执行三个关键动作:
- 调用
collection.iterator()获取迭代器 - 每次循环前调用
it.hasNext()判断是否继续 - 进入循环体前调用
it.next()取出当前元素并推进游标
这三步缺一不可。比如 ArrayList 的内部类 Itr 就靠 cursor 字段记录当前位置,next() 返回 elementData[cursor++],整个过程完全由 Iterator 实现类控制。
数组是例外:不走 Iterator
数组没有 iterator() 方法,也不实现 Iterable 接口,但 for-each 依然支持它——因为编译器对数组做了特殊处理:
- 把
for (int n : nums)直接编译成for (int i = 0; i - 全程无对象创建、无装箱拆箱(如遍历 int[])、无 fail-fast 校验
- 因此数组遍历时修改元素值没问题,但改长度不影响当前循环(因 length 是编译期快照)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










