增强for循环遍历数组时底层不使用迭代器,而是编译期直接转为基于下标的传统for循环,如for (int x : arr)被javac展开为for (int i = 0; i < arr.length; i++)。

Java 中增强 for 循环(for (Type item : array))遍历数组时,底层不使用迭代器,而是直接通过数组下标进行普通 for 循环访问,编译器会将其翻译为传统的索引访问形式。
编译期重写:转成传统 for 循环
对数组而言,javac 在编译阶段就将增强 for 循环展开为基于 length 和下标的普通循环。例如:
int[] arr = {1, 2, 3};
for (int x : arr) {
System.out.println(x);
}
等价于:
int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) {
int x = arr[i];
System.out.println(x);
}
不涉及 Iterator 接口
这点和遍历 Collection 类型(如 ArrayList)有本质区别:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 数组是 Java 语言内置类型,没有实现
Iterable接口,也没有iterator()方法 - 因此无法、也不需要调用
hasNext()或next() - JVM 对数组有专门的字节码指令支持(如
iaload,aaload),增强 for 遍历数组最终会生成这些指令
验证方式:查看字节码
用 javap -c 查看编译后的字节码,可清晰看到:
- 出现
arraylength指令获取长度 - 使用
iload加载索引变量 - 使用
iaload(对 int 数组)从数组中取元素 - 没有调用任何
Iterator相关方法
注意:集合类型走的是另一套逻辑
如果写的是 for (String s : list)(list 是 ArrayList),那底层确实会调用 list.iterator(),进入迭代器模式。但这是针对实现了 Iterable 的对象,和数组无关。

















