Heim >Java >javaLernprogramm >For-Each-Schleife vs. Iterator: Was ist effizienter zum Durchlaufen von Sammlungen?
Bestimmung der Effizienz: For-Each-Schleife vs. Iterator
Beim effizienten Durchlaufen einer Sammlung stellt sich die Frage: Welcher Ansatz ist besser? eine for-each-Schleife oder ein Iterator?
Traditionelle For-Schleife
Die traditionelle for-Schleife, allgemein als „C-Style“-Schleife bezeichnet, veranschaulicht Folgendes Syntax:
for(int i=0; i<list.size(); i++) { Object o = list.get(i); }
For-Each-Schleife
Java 5 führte die verbesserte For-Each-Schleifensyntax ein, die den Schleifenprozess rationalisiert:
for (Integer integer : a) { integer.toString(); }
Iterator
Java's Iterator-Abstraktion bietet eine alternative Möglichkeit zum Durchlaufen einer Sammlung:
for (Iterator iterator = a.iterator(); iterator.hasNext();) { Integer integer = (Integer) iterator.next(); integer.toString(); }
Leistungsunterschiede
Für das bloße Lesen von Werten aus einer Sammlung ohne Änderung macht die Wahl zwischen einer for-each-Schleife und einem Iterator keinen wesentlichen Leistungsunterschied. Beide Ansätze nutzen den Iterator intern.
Die herkömmliche for-Schleife ist jedoch möglicherweise weniger effizient als die for-each-Schleife oder der Iterator, wenn bestimmte Datenstrukturen durchlaufen werden. Verkettete Listen erfordern beispielsweise eine O(n)-Operation, um Elemente mit get(i) abzurufen. Dies führt zu einer Komplexität von O(n2) für die Schleife. Iteratoren garantieren eine O(1)-Operation für den Fortschritt, was zu einer O(n)-Komplexität für die Schleife führt.
Bytecode-Vergleich
Vergleich des von beiden Schleifen generierten Bytecodes Typen verdeutlichen ihre Äquivalenz:
For-Each-Loop-Bytecode:
ALOAD 1 INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator; ASTORE 3 GOTO L2 L3 ALOAD 3 INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object; CHECKCAST java/lang/Integer ASTORE 2 ALOAD 2 INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String; POP L2 ALOAD 3 INVOKEINTERFACE java/util/Iterator.hasNext()Z IFNE L3
Iterator-Bytecode:
ALOAD 1 INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator; ASTORE 2 GOTO L7 L8 ALOAD 2 INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object; CHECKCAST java/lang/Integer ASTORE 3 ALOAD 3 INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String; POP L7 ALOAD 2 INVOKEINTERFACE java/util/Iterator.hasNext()Z IFNE L8
Fazit
Da die for-each-Schleife und der Iterator im Hinblick auf die Effizienz im Wesentlichen die gleiche Leistung erbringen, ist dies oft eine Frage der Präferenz. In den meisten Szenarien wird die for-each-Schleife aufgrund ihrer Prägnanz aus ästhetischen Gründen bevorzugt.
Das obige ist der detaillierte Inhalt vonFor-Each-Schleife vs. Iterator: Was ist effizienter zum Durchlaufen von Sammlungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!