Редактировать: @StephenC Правильно, JLS - это гораздо лучшее место, чтобы найти ответ на что-то подобное. Вот спецификация языка link to the enhanced for loop. Там вы обнаружите, что для выражений, которые он генерирует, существует несколько разных типов, но ни один из них не будет вызывать метод более одного раза.
Простой тест показывает, что метод вызывается только один раз
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.
Редактировать
Ты меня любопытным о том, как Java компилятор справилась с этой так, используя код, приведенный выше I декомпилированы файл класса и Херес, что результат
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