Wir verwenden häufig die von JDK bereitgestellte iterative Schnittstelle, um Java -Sammlungen zu iterieren.
Iterator iterator = list.Iterator (); while (iterator.hasnext ()) {string string = iterator.next (); // etwas tun} Die Iteration kann tatsächlich einfach als Traversal verstanden werden. Es ist eine Methodenklasse, die das Traversal aller Objekte in verschiedenen Containern standardisiert. Es ist ein sehr typisches Designmuster. Das Iteratormuster ist eine Standardzugriffsmethode, die zum Durchlaufen von Sammlungsklassen verwendet wird. Es wird auf Logik aus verschiedenen Arten von Sammlungsklassen abstrahiert, wodurch die interne Struktur der Sammlung dem Kunden ausgesetzt wird. So umgehen wir damit, wenn es keinen Iterator gibt. wie folgt:
Für Arrays verwenden wir Einschüsse, um zu verarbeiten:
int [] arrays = new int [10]; für (int i = 0; i <arrays.length; i ++) {int a = arrays [i]; // etwas tun} So wird ArrayList behandelt:
Liste <String> list = new ArrayList <string> (); für (int i = 0; i <list.size (); i ++) {string string = list.get (i); // etwas tun} Für beide Methoden wissen wir immer im Voraus die interne Struktur der Sammlung. Der Zugriffscode und die Sammlung selbst sind eng gekoppelt und können die Zugriffslogik nicht von der Sammlungsklasse und dem Client -Code trennen. Gleichzeitig entspricht jede Sammlung einer Traversalmethode, und der Client -Code kann nicht wiederverwendet werden. In praktischen Anwendungen ist es ziemlich problematisch, die beiden oben genannten Sätze zu integrieren. Um die oben genannten Probleme zu lösen, ist der Iteratormodus frei und verwendet immer dieselbe Logik, um die Sammlung zu durchqueren. Dies macht den Kunden selbst unnötig, um die interne Struktur der Sammlung aufrechtzuerhalten, und alle internen Zustände werden vom Iterator aufrechterhalten. Der Kunde befasst sich nie direkt mit der Sammelklasse. Es steuert immer den Iterator und sendet ihn "vorwärts", "rückwärts" und "das aktuelle Element" -Fandte an ihn und kann die gesamte Sammlung indirekt durchqueren.
Das obige ist nur eine kurze Erklärung für das Iteratormuster. Schauen wir uns die Iterator -Schnittstelle in Java an, um zu sehen, wie sie sie implementiert.
1. Java.util.iterator
In Java ist Iterator eine Schnittstelle, die nur iterative Grundregeln liefert. In JDK ist es definiert wie folgt: ein Iterator, der die Sammlung iteriert. Der Iterator ersetzt die Aufzählung im Java -Sammlungsrahmen. Es gibt zwei Unterschiede zwischen Iteratoren und Aufzählungen:
1. Mit dem Iterator kann der Anrufer Elemente aus der Sammlung entfernen, auf die der Iterator während der Iteration mit gut definierter Semantik vermittelt wird.
2. Der Methodenname wurde verbessert.
Die Schnittstellendefinition lautet wie folgt:
public interface iterator {boolean hasNext (); Objekt Next (); void remove ();} In:
Object Next (): Gibt den Verweis auf das Element zurück, das der Iterator nur überquert. Der Rückgabewert ist Objekt, das auf den Typ, den Sie benötigen, gegossen werden muss.
boolean hasNext (): Bestimmt, ob im Container zugreifen Elemente verfügbar sind
void remove (): Entfernen Sie das Element, das der Iterator gerade gekreuzt hat
Für uns müssen wir nur Next () und HasNext () verwenden, um die Iteration zu vervollständigen. wie folgt:
für (iterator it = c.Inatorator (); it.hasnext ();) {Object o = it.Next (); // etwas mach} Die vorherige Erklärung ist, dass Iterator einen großen Vorteil hat, dh die internen Ergebnisse des Satzes nicht kennen müssen. Die interne Struktur und der Zustand des Satzes werden von Iterator aufrechterhalten. Wir beurteilen und erhalten das nächste Element über die einheitlichen Methoden hasNext () und next (). Was die spezifische interne Implementierung betrifft, müssen wir uns darüber keine Sorgen machen. Als qualifizierter Programmierer ist es jedoch sehr notwendig, die Implementierung von Iterator herauszufinden. Der Quellcode von ArrayList wird unten analysiert.
2. Implementierung des Iterators für jede Sammlung
Lassen Sie uns die Iterator -Implementierung von ArrayList analysieren. Wenn wir die Datenstrukturen von ArrayList, Hashset und Treeset verstehen und intern implementieren, werden wir zuversichtlich sein, wie sie Iterator implementieren. Da die interne Implementierung von ArrayList ein Array verwendet, müssen wir nur den Index der entsprechenden Position aufzeichnen, und die Implementierung seiner Methode ist relativ einfach.
2.1. Iterator -Implementierung von ArrayList
In der ArrayList definiert zunächst eine innere Klasse ITR, die die Iterator -Schnittstelle wie folgt implementiert:
Private Klasse ITR implementiert Iterator <E> {// etwas tun} Und die iterator () -Methode der ArrayList wird implementiert:
public iterator <e> iterator () {return New ITR ();} Die Methode von ArrayList.iterator () gibt also die ITR () Innere Klasse zurück. Wir müssen uns also jetzt um die Implementierung der ITR () inneren Klasse kümmern:
Drei INT-Typ-Variablen sind in ITR definiert: Cursor, Lastret und ADGETMODCOUNT. wobei der Cursor die Indexposition des nächsten Elements darstellt und Lastret die Indexposition des vorherigen Elements repräsentiert
int Cursor; int lastret = -1; int erwartModcount = modcount;
Aus den Definitionen von Cursor und Lastret ist ersichtlich, dass Lastret immer ein weniger als Cursor war, sodass die Implementierungsmethode von HasNext () äußerst einfach ist. Sie müssen nur beurteilen, ob Cursor und Lastret gleich sind.
public boolean hasNext () {return cursor! = size;} Die Implementierung von Next () ist tatsächlich relativ einfach. Geben Sie einfach das Element an der Position des Cursorindex zurück und ändern Sie dann den Cursor und den Lastret
public e next () {techeforComodification (); int i = cursor; // Indexposition aufzeichnen, wenn (i> = Größe) // Wenn das erhaltene Element größer ist als die Anzahl der Sammelelemente, wird eine Ausnahme geworfen. if (i> = elementData.length) werfen neue ConcurrentModificationException (); Cursor = i + 1; // Cursor + 1Return (e) elementData [lastret = i]; // Lastret + 1 und geben Sie das Element am Cursor} zurück checkforComodification () wird hauptsächlich verwendet, um festzustellen, ob die Anzahl der Änderungen eines Satzes legal ist, dh festzustellen, ob der Satz während des Traversalprozesses geändert wurde. ModCount wird verwendet, um die Anzahl der Modifikationen der ArrayList -Sammlung aufzunehmen, die auf 0 initialisiert wurden, und wenn die Sammlung einmal geändert wird (das interne Update zählt nicht für die Struktur), wie z. B. Add, Entfernen und andere Methoden, ModCount + 1. Wenn ModCount also unverändert bleibt, bedeutet dies, dass der Inhalt der Sammlung nicht geändert wurde. Dieser Mechanismus wird hauptsächlich verwendet, um den schnellen Ausfallmechanismus der ArrayList -Sammlung zu implementieren. In Java -Sammlungen hat ein großer Teil der Sammlungen einen schnellen Versagensmechanismus. Ich werde hier nicht darüber sprechen und später darüber sprechen. Um sicherzustellen, dass während des Durchquerens keine Fehler vorliegen, sollten wir sicherstellen, dass die Sammlung während des Durchfahrtenprozesses keine strukturellen Änderungen an der Sammlung gibt (mit Ausnahme der Entfernungsmethode). Wenn ein Ausnahmefehler auftritt, sollten wir sorgfältig prüfen, ob das Programm einen Fehler aufweist, anstatt ihn nicht nach dem Fangen zu verarbeiten.
endgültiger void checkforComodification () {if (modcount! = erwartungsmodcount) neue ConcurrentModificationException ();} Die Methode remove () ist eine Implementierung, die die Methode von REME () von ArrayList selbst aufruft, um das Lastret -Positionselement zu löschen und dann ModCount zu ändern.
public void remove() {if (lastRet < 0)throw new IllegalStateException();checkForComodification();try {ArrayList.this.remove(lastRet);cursor = lastRet;lastRet = -1;expectedModCount = modCount;} catch (IndexOutOfBoundsException ex) {throw new ConcurrentModificationException();}}Das oben oben ist die Implementierungsmethode der Iterator -Iteration der Java -Sammlung, die Ihnen vom Editor vorgestellt wurde. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!