Heim >Java >javaLernprogramm >For-Each-Schleife vs. Iterator: Was ist effizienter zum Durchlaufen von Sammlungen?

For-Each-Schleife vs. Iterator: Was ist effizienter zum Durchlaufen von Sammlungen?

DDD
DDDOriginal
2024-11-17 11:54:02482Durchsuche

For-Each Loop vs. Iterator: Which is More Efficient for Traversing Collections?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn