編輯:@StephenC是對的,JLS是一個更好的地方找到這種性質的答案。語言規範中有一個link to the enhanced for loop。在那裏你會發現它有幾種不同類型的for語句,但它們都不會超過1次調用這個方法。
簡單測試表明,該方法只調用一次
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();
}
}
輸出:
get the strings
one
two
three
所以基本上他們是同樣的事情。如果你想在for循環之外使用數組,唯一可能對2nd有利的是。
編輯
你讓我好奇的處理上面我會這樣使用的代碼Java編譯器如何反編譯的類文件和繼承人的結果是什麼
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"
};
}
,你可以看到編譯器簡單地將你的for循環重構爲一個標準循環!它也進一步證明,實際上它們在編譯器完成之後完全相同。
它只被調用一次,但第二個版本太冗長了。你正在做的是通過一個列表。一條線就夠了。 – Navin