Vorwort
Der Grund für die Einführung von Verbesserungen für Schleifen: In früheren Versionen von JDK5 ist es problematischer, Elemente in einem Array oder einer Sammlung und Iterator der Array -Länge oder -Kollektion zu durchqueren.
Eine neue Syntax ist in JDK5 definiert - verbessert für Schleifen, um diese Operationen zu vereinfachen. Verbessert für Schleifen können nur für Arrays oder Sammlungen verwendet werden, die iterbare Schnittstellen implementieren.
Syntaxformat:
für (variabler Typ Variable: Array oder Sammlung, die iteriert werden müssen) {
}
In Java haben das Durchlaufen von Sammlungen und Arrays im Allgemeinen die folgenden drei Formen:
für (int i = 0; i <list.size (); i ++) {System.out.print (list.get (i)+",");} iterator iterator = list.iterator (); while (iterator.hasnext ()) {System.out.print (iterator.next () + ",");} für (Integer i: list) {System.out.print (i + ",");} Das erste ist gewöhnlich für die Schleifentraversal, die zweite ist die Verwendung von Iteratoren für die Durchquerung, und der dritte wird (für jeden) allgemein als verbessert als verbessert bezeichnet.
Implementierungsprinzip
Es ist ersichtlich, dass die von Java bereitgestellte dritte Form syntaktischer Zucker ist. Hier analysieren wir, wie diese für die Schleife in der zugrunde liegenden Schicht verbessert wird.
Wir dekompilieren den folgenden Code:
für (Ganzzahl i: Liste) {System.out.println (i);}Nach der Dekompilierung:
Integer i; für (iterator iterator = list.iterator (); iterator.hasnext (); System.out.println (i)) {i = (Integer) iterator.next (); } Der dekompilierte Code ist eigentlich ziemlich kompliziert. Lassen Sie uns ihn also in der Reihenfolge der Ausführung aufschlüsseln:
Ganzzahl I; definiert eine vorübergehende Variable i
Iterator iterator = list.Iterator (); Holen Sie sich den Iterator der Liste
iterator.hasnext (); Bestimmt, ob es im Iterator nicht rägte Elemente gibt
i = (Integer) iterator.next (); Holen Sie sich das erste unaufgeehrte Element und weisen Sie es der temporären Variablen i zu
System.out.println (i) gibt den Wert der temporären Variablen i aus
Dieser Zyklen, bis alle Elemente in der Liste durchquert werden.
Durch die Dekompilierung sehen wir, dass die zugrunde liegende Schicht der für Schleifen in Java tatsächlich durch das Iteratormuster implementiert wird.
Die Grube der Verbesserung der für Schleife
Dies soll eine Grube in der Verbesserung der Schleife sein, aber es liegt vor allem, weil einige Menschen im Umsetzungsprinzip der Verbesserung der Schleife in die Grube eintreten können.
Da die Verbesserung der Schleife durch einen Iterator implementiert wird, muss sie die Eigenschaften eines Iterators haben.
In Java gibt es einen fehlspastenden Mechanismus. Wenn Sie einen Iterator verwenden, um Elemente zu durchqueren, müssen Sie beim Löschen der Sammlung vorsichtig sein. Wenn Sie es nicht ordnungsgemäß verwenden, kann eine ConcurrentModificationException auftreten. Dies ist eine Laufzeitausnahme und tritt während der Zusammenstellungsperiode nicht auf. Es wird nur explodieren, wenn das Programm tatsächlich ausgeführt wird.
Wie im folgenden Code:
für (Schüler stu: Studenten) {if (stu.getId () == 2) Studenten.Remove (stu); }Eine Ausnahme von ConcurrentModificationException wird ausgelöst.
Iterator arbeitet in einem separaten Thread und hat eine Mutex -Sperre. Nachdem der Iterator erstellt wurde, zeigt eine Einzel-Link-Index-Tabelle auf das ursprüngliche Objekt. Wenn sich die Anzahl der ursprünglichen Objekte ändert, ändert sich der Inhalt dieser Indextabelle nicht synchron. Wenn sich der Indexzeiger nach hinten bewegt, kann das IT-IT-Objekt nicht gefunden werden. Nach dem fehlgeschnittenen Prinzip wird Iterator sofort geworfen.
Java.util.ConcurrentModificationException -Ausnahme.
Daher erlaubt Iterator nicht zu, dass iterierte Objekte geändert werden können, wenn sie funktioniert.
Sie können jedoch die eigene Methode des Iterators verwenden remove() um das Objekt zu löschen. Iterator.remove() führt die Konsistenz des Index bei gleichzeitiger Löschung des aktuellen iterierten Objekts.
Elemente korrekt löschen beim Durchlaufen:
Iterator <Student> Stuper = student.Iterator (); while (stuper.hasnext ()) {student student = stuper.next (); if (student.getId () == 2) STOITER.REMOVE (); // Hier müssen Sie die Methode des Iterators entfernen, um das aktuelle Objekt zu entfernen. Wenn Sie die Liste der Liste entfernen, erscheint die ConcurrentModificationException auch} OK, hier werde ich Ihnen das Implementierungsprinzip vorstellen, um die für die Schleife und die Fallstricke zu verbessern, in die Sie möglicherweise nicht ordnungsgemäß verwendet werden. Obwohl es sich um eine einfache For-Each-Syntax handelt, müssen Sie auch seine Prinzipien verstehen, sonst kann es zu unerklärlichen Problemen führen.
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.