Heute habe ich glücklich codiert, als ich zu einem Code kam, den ich bereits hunderte Male verwendet habe:
Durch eine Sammlung iterieren (hier ArrayList)
Aus irgendeinem Grund habe ich mir die Optionen für die automatische Vervollständigung von Eclipse angesehen und mich gefragt:
In welchen Fällen sind die folgenden Schleifen besser zu verwenden als die anderen?
Die klassische Array-Indexschleife:
for (int i = 0; i < collection.length; i++) {
type array_element = collection.get(index);
}
Der Iterator hatNext () / next ():
for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
type type = (type) iterator.next();
}
Und mein Favorit, weil es so einfach zu schreiben ist:
for (iterable_type iterable_element : collection) {
}
java
collections
for-loop
Jason Rogers
quelle
quelle
for (Iterator<type> iterator = collection.iterator(); iterator.hasNext();) { type type = iterator.next(); }
Antworten:
Der erste ist nützlich, wenn Sie auch den Index des Elements benötigen. Dies entspricht im Grunde den beiden anderen Varianten für
ArrayList
s, ist jedoch sehr langsam, wenn Sie a verwendenLinkedList
.Der zweite ist nützlich, wenn Sie den Index des Elements nicht benötigen, die Elemente jedoch möglicherweise während der Iteration entfernen müssen. Dies hat jedoch den Nachteil, dass die IMO etwas zu ausführlich ist.
Die dritte Version ist auch meine bevorzugte Wahl. Es ist kurz und funktioniert in allen Fällen, in denen Sie keine Indizes oder den zugrunde liegenden Iterator benötigen (dh Sie greifen nur auf Elemente zu, entfernen sie nicht oder ändern sie
Collection
in irgendeiner Weise - was der häufigste Fall ist).quelle
Collection
sind billig per Index abzurufen).List
als Baum implementiert ist, wäre sie tatsächlich langsamer).Alle von ihnen haben ihre eigenen Verwendungszwecke:
Wenn Sie eine iterable haben und bedingungslos zu allen von ihnen durchlaufen müssen:
für (iterable_type iterable_element: collection)
Wenn Sie eine iterable haben, aber bedingt durchlaufen müssen:
for (Iterator iterator = collection.iterator (); iterator.hasNext ();)
Wenn die Datenstruktur nicht iterierbar implementiert:
für (int i = 0; i <collection.length; i ++)
quelle
break
und / odercontinue
Es gibt zusätzlich den Stream () util von Sammlungen mit Java 8
oder
Weitere Informationen zu Java 8 Stream und Sammlungen für wonderers Link
quelle
Keiner von ihnen ist "besser" als die anderen. Der dritte ist für mich besser lesbar, aber für jemanden, der keine Foreaches verwendet, könnte er seltsam aussehen (er könnte den ersten bevorzugen). Alle 3 sind für jeden, der Java versteht, ziemlich klar. Wählen Sie also, was Sie für den Code besser fühlen.
Das erste ist das grundlegendste, also das universellste Muster (funktioniert für Arrays, alle Iterables, die mir einfallen). Das ist der einzige Unterschied, den ich mir vorstellen kann. In komplizierteren Fällen (z. B. müssen Sie Zugriff auf den aktuellen Index haben oder die Liste filtern müssen) sind der erste und der zweite Fall möglicherweise sinnvoller. Für den einfachen Fall (iterierbares Objekt, keine besonderen Anforderungen) scheint der dritte der sauberste zu sein.
quelle
Die erste Option ist eine bessere Leistung (da ArrayList die RandomAccess-Schnittstelle implementiert). Gemäß dem Java-Dokument sollte eine List-Implementierung die RandomAccess-Schnittstelle implementieren, wenn für typische Instanzen der Klasse diese Schleife gilt:
läuft schneller als diese Schleife:
Ich hoffe, es hilft. Die erste Option wäre für sequentielle Zugriffslisten langsam.
quelle
Hier ist ein Beispiel
quelle