Heim  >  Artikel  >  Java  >  Gibt es einen Leistungsunterschied zwischen der Verwendung einer For-Each-Schleife und eines Iterators für die Sammlungsdurchquerung in Java?

Gibt es einen Leistungsunterschied zwischen der Verwendung einer For-Each-Schleife und eines Iterators für die Sammlungsdurchquerung in Java?

DDD
DDDOriginal
2024-11-14 22:14:02898Durchsuche

Is There a Performance Difference Between Using a For-Each Loop and an Iterator for Collection Traversal in Java?

Für jede Schleife vs. Iterator: Effizienz beim Durchlaufen von Sammlungen

Einführung

Beim Durchlaufen Bei einer Sammlung in Java besteht die Wahl zwischen der Verwendung einer for-each-Schleife und eines Iterators. In diesem Artikel werden die Effizienzunterschiede zwischen diesen beiden Ansätzen untersucht.

For-Each-Schleife

Die in Java 5 eingeführte for-each-Schleife (auch als erweiterte for bekannt). Schleife) ist eine prägnante und leicht lesbare Syntax zum Durchlaufen von Sammlungen. Es nutzt den Iterator intern:

List<Integer> a = new ArrayList<>();
for (Integer integer : a) {
  integer.toString();
}

Iterator

Ein Iterator bietet eine standardisierte Schnittstelle zum Durchlaufen von Sammlungen. Es ermöglicht eine individuelle Steuerung des Traversal-Prozesses.

List<Integer> a = new ArrayList<>();
for (Iterator<Integer> iterator = a.iterator(); iterator.hasNext();) {
   Integer integer = iterator.next();
   integer.toString();
}

Effizienzvergleich

Beim einfachen Lesezugriff auf eine Sammlung gibt es praktisch keinen Leistungsunterschied zwischen den for-each-Schleife und der Iterator-Ansatz. Die for-each-Schleife verwendet intern den Iterator-Mechanismus.

Bei Verwendung der traditionellen Schleife im „C-Stil“ mit get(i):

for (int i = 0; i < list.size(); i++) {
   Object o = list.get(i);
}

Der Iterator-Ansatz (sowohl für -jede Schleife und expliziter Iterator) kann für bestimmte Datenstrukturen deutlich effizienter sein. In einer verknüpften Liste ist get(i) beispielsweise eine O(n)-Operation. Durch die Verwendung der O(1) next()-Operation eines Iterators wird sichergestellt, dass die Schleife in O(n) Zeit ausgeführt wird, während die get(i)-Schleife in O(n2) Zeit ausgeführt wird.

Bytecode-Vergleich

Um zu bestätigen, dass die for-each-Schleife den Iteratormechanismus verwendet, können wir den generierten Bytecode für beide vergleichen Ansätze:

For-Each-Schleife

List<Integer> a = new ArrayList<>();
for (Integer integer : a) {
  integer.toString();
}
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 3
...

Iterator

List<Integer> a = new ArrayList<>();
for (Iterator<Integer> iterator = a.iterator(); iterator.hasNext();) {
  Integer integer = iterator.next();
  integer.toString();
}
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 2
...

As Sie können beobachten, dass der generierte Bytecode identisch ist, was darauf hindeutet, dass es bei der Verwendung beider keine Leistungseinbußen gibt Ansatz.

Fazit

Zusammenfassend lässt sich sagen, dass beim Durchlaufen einer Sammlung für schreibgeschützten Zugriff der Unterschied zwischen einer for-each-Schleife und einem Iterator minimal ist. Der Iterator bietet nur dann Vorteile, wenn mit bestimmten Datenstrukturen gearbeitet wird oder ein benutzerdefiniertes Iterationsverhalten erforderlich ist. Der Einfachheit und Lesbarkeit halber ist die for-each-Schleife im Allgemeinen die bevorzugte Wahl.

Das obige ist der detaillierte Inhalt vonGibt es einen Leistungsunterschied zwischen der Verwendung einer For-Each-Schleife und eines Iterators für die Sammlungsdurchquerung in Java?. 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