当JVM使用for-each循环遍历数组时,JVM是否会创建迭代器?

时间:2015-05-12 11:08:44

标签: java foreach iterator

很抱歉,如果已经被问到,但我没有在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

2 个答案:

答案 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...
   ......
}