Nếu bạn chỉ đi lang thang trên bộ sưu tập để đọc tất cả các giá trị, thì không có sự khác biệt giữa việc sử dụng một cú pháp lặp hoặc cú pháp vòng lặp mới, vì cú pháp mới chỉ sử dụng trình lặp dưới nước.
Tuy nhiên, nếu bạn có nghĩa là bằng cách lặp vòng lặp "c-style" cũ:
for(int i=0; i<list.size(); i++) {
Object o = list.get(i);
}
Sau đó, vòng lặp for mới, hoặc iterator, có thể hiệu quả hơn rất nhiều, tùy thuộc vào cấu trúc dữ liệu cơ bản. Lý do cho điều này là đối với một số cấu trúc dữ liệu, get(i)
là một hoạt động O (n), làm cho vòng lặp hoạt động O (n 2 ). Một danh sách liên kết truyền thống là một ví dụ về cấu trúc dữ liệu như vậy. Tất cả các trình vòng lặp có một yêu cầu cơ bản next()
phải là phép toán O (1), tạo vòng lặp O (n).
Để xác minh rằng trình lặp được sử dụng dưới nước theo cú pháp vòng lặp for mới, hãy so sánh các mã byte được tạo từ hai đoạn mã Java sau. Đầu tiên là vòng lặp for:
List<Integer> a = new ArrayList<Integer>();
for (Integer integer : a)
{
integer.toString();
}
// Byte code
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 3
GOTO L2
L3
ALOAD 3
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 2
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L2
ALOAD 3
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L3
Và thứ hai, trình vòng lặp:
List<Integer> a = new ArrayList<Integer>();
for (Iterator iterator = a.iterator(); iterator.hasNext();)
{
Integer integer = (Integer) iterator.next();
integer.toString();
}
// Bytecode:
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 2
GOTO L7
L8
ALOAD 2
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 3
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L7
ALOAD 2
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L8
Như bạn có thể thấy, mã byte được tạo giống hệt nhau một cách hiệu quả, do đó không có hình phạt hiệu năng nào khi sử dụng một trong hai hình thức. Do đó, bạn nên chọn hình thức vòng lặp hấp dẫn nhất về mặt thẩm mỹ đối với bạn, đối với hầu hết mọi người sẽ là vòng lặp cho mỗi vòng lặp, vì điều đó có ít mã nồi hơi hơn.