Chỉnh sửa: @StephenC là đúng, JLS là nơi tốt hơn để tìm câu trả lời cho nội dung này. Dưới đây là một số link to the enhanced for loop trong đặc tả ngôn ngữ. Trong đó bạn sẽ thấy rằng có một vài loại khác nhau của các câu lệnh mà nó tạo ra nhưng không ai trong số họ gọi phương thức này quá 1 lần.
thử nghiệm đơn giản cho thấy rằng phương pháp này chỉ được gọi một lần
public class TestA {
public String [] theStrings;
public TestA() {
theStrings = new String[] {"one","two", "three"};
for(String string : getTheStrings()) {
System.out.println(string);
}
}
public String[] getTheStrings() {
System.out.println("get the strings");
return theStrings;
}
public static void main(String [] args) {
new TestA();
}
}
Output:
get the strings
one
two
three
Vì vậy, về cơ bản họ là những điều tương tự. Điều duy nhất có thể có lợi cho lần thứ 2 là nếu bạn muốn sử dụng mảng bên ngoài vòng lặp for.
Sửa
Bạn đã cho tôi tò mò về cách trình biên dịch java xử lý này để sử dụng các mã trên tôi dịch ngược file class và heres những gì kết quả là
public class TestA
{
public TestA()
{
String as[];
int j = (as = getTheStrings()).length;
for(int i = 0; i < j; i++)
{
String string = as[i];
System.out.println(string);
}
}
public String[] getTheStrings()
{
System.out.println("get the strings");
return theStrings;
}
public static void main(String args[])
{
new TestA();
}
public String theStrings[] = {
"one", "two", "three"
};
}
Như bạn có thể xem trình biên dịch chỉ đơn giản là cấu trúc lại vòng lặp của bạn thành một vòng lặp tiêu chuẩn! Nó cũng chứng minh thêm rằng trong thực tế, chúng là chính xác như nhau sau khi trình biên dịch được thông qua với nó.
Nguồn
2014-05-04 04:25:40
Nó chỉ được gọi một lần, nhưng phiên bản thứ hai là quá dài dòng. Tất cả những gì bạn đang làm là trải qua một danh sách. Một dòng là đủ. – Navin