很抱歉,如果已经被问到,但我没有在stackoveflow上找到答案,我没有看到有关此字段的官方教程。
问题出在标题中 - 如果我们有像
这样的代码int[] array = new int[20];
for (int el : array) {
...
}
JVM是否将其作为循环
的标准运行for (int i = 0; i < array.length; i++)
或者它会创建一个迭代器?
UPD 此链接可能有助于完成答案
Fastest way to iterate an Array in Java: loop variable vs enhanced for statement
答案 0 :(得分:2)
Java中的数组不实现 Iterable 接口,因此您无法从数组中获取迭代器。此外,您不能在诸如int之类的基本类型上使用Iterator,因为基本类型不能是通用参数。例如。如果你想要一个Iterator,你必须使用Iterator,这将导致大量的自动装箱和-unboxing,如果它由int []支持。
JVM不太可能为for-each循环数组创建迭代器,因为效率非常低。
实际上,编译器会将for-each循环转换为索引for循环。您可以通过查看此方法的反编译字节代码来检查它:
源代码:
public void test() {
int[] array = new int[20];
for (int el : array) {
System.out.println("test");
}
}
反编译的字节码:
public void test() {
int[] array = new int[20];
int[] var2 = array;
int var3 = array.length;
for(int var4 = 0; var4 < var3; ++var4) {
int var10000 = var2[var4];
System.out.println("lol");
}
}
答案 1 :(得分:0)
for-each循环是普通for循环的可迭代形式,这是一种更好的构建数据结构。
cars是一个数组,然后用于例如: -
for(Car car: cars){
//car.name() = audi...
....
}
实际上与下面显示的代码相同......
for(Iterator<Car> iterator = cars.iterator(); iterator.hasNext(); ){
Car car = iterator.next();
//car.name() = audi...
......
}