tôi biên soạn đoạn mã sau:
public class ArrayIterator
{
public static void main(String[] argv)
{
String[] strs = new String[] { "1", "2", "3", "4", "5" };
enhancedPrint(strs);
normalPrint(strs);
}
public static void enhancedPrint(String[] strs)
{
for (String s : strs)
{
System.out.println(s);
}
}
public static void normalPrint(String[] strs)
{
String[] localArray = strs;
int len = localArray.length;
for (int i = 0; i < len; i++)
{
String s = localArray[i];
System.out.println(s);
}
}
}
Đây là tháo rời (javap -c ArrayIterator
) bytecode cho các chức năng iterating:
việc tăng cường in:
public static void enhancedPrint(java.lang.String[]);
Code:
0: aload_0
1: astore_1
2: aload_1
3: arraylength
4: istore_2
5: iconst_0
6: istore_3
7: iload_3
8: iload_2
9: if_icmpge 31
12: aload_1
13: iload_3
14: aaload
15: astore 4
17: getstatic #10; //Field java/lang/System.out:Ljava/io/PrintStream;
20: aload 4
22: invokevirtual #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
25: iinc 3, 1
28: goto 7
31: return
Một bình thường đối với vòng lặp:
public static void normalPrint(java.lang.String[]);
Code:
0: aload_0
1: astore_1
2: aload_1
3: arraylength
4: istore_2
5: iconst_0
6: istore_3
7: iload_3
8: iload_2
9: if_icmpge 31
12: aload_1
13: iload_3
14: aaload
15: astore 4
17: getstatic #10; //Field java/lang/System.out:Ljava/io/PrintStream;
20: aload 4
22: invokevirtual #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
25: iinc 3, 1
28: goto 7
31: return
Như bạn có thể thấy, trong cả hai trường hợp, trình biên dịch đang tải chiều dài mảng (strs.length
) và vòng lặp chống lại nó. Chúng ta thấy rằng vòng lặp for-each được tăng cường, trong trường hợp của một Array là cú pháp đường để lặp lại với chiều dài của mảng (chứ không phải trong trường hợp của Object khi nó sử dụng một Iterator).
Tôi đã chỉnh sửa vòng lặp 'bình thường' sao cho nó ít thành ngữ hơn, nhưng nó có cùng mã byte như tăng cường cho vòng lặp. Đối với tất cả các ý định và mục đích, bình thường cho phiên bản vòng lặp là những gì trình biên dịch tạo ra khi nó biên dịch tăng cường cho mỗi vòng lặp.
Nguồn
2010-12-30 05:29:20
bản sao có thể có của [Làm thế nào để Java cho mỗi vòng lặp hoạt động?] (Http://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work) –
+1 thú vị câu hỏi và hoàn toàn không trùng lặp. –
Không hoàn toàn. Tôi đã biết nó là iterable, nhưng làm thế nào để iterator biết khi nào dừng lặp lại? – SapphireSun