不,它不完全一样。而且这很容易验证,恕我直言,甚至不令人惊讶。
只需编译如下两个功能:
public static void test1(Object[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public void test2(Object[] arr) {
for(Object o : arr) {
System.out.println(o);
}
}
,并期待在输出:
public static void test1(java.lang.Object[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: arraylength
5: if_icmpge 23
8: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_0
12: iload_1
13: aaload
14: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
17: iinc 1, 1
20: goto 2
23: return
public void test2(java.lang.Object[]);
Code:
0: aload_1
1: astore_2
2: aload_2
3: arraylength
4: istore_3
5: iconst_0
6: istore 4
8: iload 4
10: iload_3
11: if_icmpge 34
14: aload_2
15: iload 4
17: aaload
18: astore 5
20: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
23: aload 5
25: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
28: iinc 4, 1
31: goto 8
34: return
}
我只是包括println()一样,让我们看到一些与变量并提出完成确保javac不会优化它。显然在更大的图片中,差异并不重要,它们几乎不可测量,但仍然不是相同的代码;)
尽管我不确定第二个函数究竟发生了什么,所以如果有人想要花点时间和剖析代码继续;-)
来源
2011-03-20 18:07:11
Voo
非常感谢。所以在第二个声明中,我将只有一个内存分配给迭代器?或者为每次迭代分配不同的分配? 而在第三个... Java分配一个隐藏的迭代器?数组长度的隐藏整数? – Oneiros 2011-03-20 16:28:12
这是正确的。如果您喜欢冒险,可以使用javap查看每种循环的生成的字节码。他们应该非常接近相同。 – 2011-03-20 16:33:09
哦,我不知道javap ...再次感谢你! :) – Oneiros 2011-03-20 16:37:48