In Java eine for-each-Schleife.
Wenn ich eine Methode habe, die ein Array namens genArray()
erzeugt.
Wird das Array im folgenden Code jedes Mal erneut generiert, indem genArray()
aufgerufen wird?
Oder wird Java einmal die Methode aufrufen und eine Kopie vom Array speichern?
Danke
Über die erweiterte for-Anweisung , die Java-Sprache Spezifikationen schreibt:
Die erweiterte for-Anweisung hat die Formular:
%Vor%Der Ausdruck muss einen Typ haben
Iterable
oder sonst muss es von einem sein Array-Typ (§10.1) oder eine Kompilierzeit Fehler tritt auf.Der Gültigkeitsbereich einer lokalen Variablen, die deklariert wurde im FormalParameter Teil eines Verbesserte
for
-Anweisung (§14.14) ist die enthaltene AnweisungDie Bedeutung der erweiterten
for
Aussage wird durch Übersetzung in gegeben eine grundlegendefor
-Anweisung.Wenn der Typ von
%Vor%Expression
ist a Subtyp vonIterable
, dann sollteI
sein der Typ des Ausdrucks Ausdruck.iterator()
. Die erweitertefor
-Anweisung ist äquivalent zu einer grundlegendenfor
Aussage des Formular:Wo
#i
ist ein Compiler-generiert Bezeichner, der sich von jedem unterscheidet andere Bezeichner (Compiler-generiert oder anders), die im Geltungsbereich sind (§6.3) an dem Punkt, wo die verbesserte für Aussage tritt auf.Ansonsten ist der Ausdruck unbedingt erforderlich hat einen Array-Typ,
%Vor%T[]
. Lassen SieL1 ... Lm
sei die (möglicherweise leere) Folge von Etiketten unmittelbar vor dem Verbessertefor
-Anweisung. Dann ist die Bedeutung der erweiterten for-Anweisung ist gegeben durch die folgenden grundlegendenfor
Aussage:Wobei a und i vom Compiler generiert werden Bezeichner, die sich von denen unterscheiden andere Bezeichner (Compiler-generiert oder anders), die im Bereich der Zeigen Sie, wo die erweiterte for-Anweisung tritt auf.
In Ihrem Fall gibt genArray()
keinen Subtyp von Iterable
, sondern einen Array-Typ zurück, sodass Ihre erweiterte for
-Anweisung der folgenden grundlegenden for
-Anweisung entspricht:
Und genArray()
wird also nur einmal aufgerufen (aber die aktuell akzeptierte Antwort ist teilweise falsch).
Java ruft genArray () einmal auf, ruft das Iterator-Objekt ab und ruft es mehrmals auf.