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!