Để bổ sung cho những gì đang được nói và xác minh rằng spec là làm những gì nó nói, chúng ta hãy nhìn vào bytecode tạo ra cho lớp sau, thực hiện vòng lặp kiểu cũ và mới để lặp qua danh sách được trả về bằng một cuộc gọi phương thức, getList()
:
public class Main {
static java.util.List getList() { return new java.util.ArrayList(); }
public static void main(String[] args) {
for (Object o : getList()) {
System.out.print(o);
}
for (java.util.Iterator itr = getList().iterator(); itr.hasNext();) {
Object o = itr.next(); System.out.print(o);
}
}
}
phần có liên quan của kết quả:
0: invokestatic #4; //Method getList
3: invokeinterface #5, 1; //InterfaceMethod java/util/List.iterator
8: astore_1
9: aload_1
10: invokeinterface #6, 1; //InterfaceMethod java/util/Iterator.hasNext
15: ifeq 35
18: aload_1
19: invokeinterface #7, 1; //InterfaceMethod java/util/Iterator.next
24: astore_2
25: getstatic #8; //Field java/lang/System.out
28: aload_2
29: invokevirtual #9; //Method java/io/PrintStream.print
32: goto 9
35: invokestatic #4; //Method getList
38: invokeinterface #10, 1; //InterfaceMethod java/util/List.iterator
43: astore_1
44: aload_1
45: invokeinterface #6, 1; //InterfaceMethod java/util/Iterator.hasNext
50: ifeq 70
53: aload_1
54: invokeinterface #7, 1; //InterfaceMethod java/util/Iterator.next
59: astore_2
60: getstatic #8; //Field java/lang/System.out
63: aload_2
64: invokevirtual #9; //Method java/io/PrintStream.print
67: goto 44
70: return
Điều này cho thấy vòng đầu tiên (0-32) và lần thứ hai (35-67) là giống hệt.
Bytecode được tạo chính xác giống như.
Tôi chân thành hy vọng như vậy, nếu không tôi có nhiều mã khủng khiếp để viết lại ... – skaffman
bản sao có thể có của http://stackoverflow.com/questions/1618202/java-foreach-loop –
@Pascal Thivent - Có, nhưng tiêu đề của tôi tốt hơn :) – morgancodes