不,它不完全一樣。而且這很容易驗證,恕我直言,甚至不令人驚訝。
只需編譯如下兩個功能:
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