Modifica: @StephenC ha ragione, il JLS è un posto molto migliore per trovare una risposta per qualcosa di questa natura. Ecco uno link to the enhanced for loop nelle specifiche della lingua. Lì scoprirai che ci sono diversi tipi di istruzioni che genera, ma nessuno di loro chiamerebbe il metodo più di una volta.
Semplice test dimostra che il metodo viene chiamato una sola volta
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();
}
}
uscita:
get the strings
one
two
three
Quindi, in sostanza essi sono la stessa cosa. L'unica cosa che potrebbe essere utile per il secondo sarebbe se si desidera utilizzare l'array al di fuori del ciclo for.
Modifica
You got me curioso di sapere come il compilatore Java gestito questo modo utilizzando il codice di cui sopra ho decompilato il file di classe e heres quello che il risultato è
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"
};
}
come si può vedi il compilatore semplicemente ristrutturato il tuo ciclo for in un loop standard! Dimostra inoltre che, in effetti, sono esattamente gli stessi dopo che il compilatore è riuscito a farcela.
fonte
2014-05-04 04:25:40
Si chiama solo una volta, ma la seconda versione è troppo prolissa. Tutto quello che stai facendo è passare attraverso una lista. Una riga è sufficiente. – Navin