Was ist der genaue Unterschied zwischen diesen beiden Schnittstellen? Hat Enumeration
Vorteile gegenüber der Verwendung von Iterator
? Wenn jemand etwas näher ausführen könnte, wäre ein Referenzartikel wünschenswert.
Wenn Sie sich die Java-API-Spezifikation für die Iterator
- Schnittstelle ansehen, werden die Unterschiede zwischen Enumeration
erläutert:
Iteratoren unterscheiden sich von Aufzählungen auf zwei Arten:
- Iteratoren erlauben dem Aufrufer, Elemente aus dem zugrunde liegenden .__ zu entfernen. Sammlung während der Iteration mit wohldefinierte Semantik.
- Methodennamen wurden verbessert.
Die untere Zeile lautet, dass sowohl Enumeration
als auch Iterator
aufeinanderfolgende Elemente ergeben. Iterator
wurde jedoch so verbessert, dass die Methodennamen kürzer sind, und verfügt über eine zusätzliche remove
-Methode. Hier ist ein Vergleich nebeneinander:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Wie auch in den Java-API-Spezifikationen erwähnt, sollte Iterator
für neuere Programme Enumeration
vorgezogen werden, da "Iterator anstelle von Enumeration im Java-Collection-Framework" fungiert. (Aus den Iterator
Spezifikationen.)
Iteratoren sind ausfallsicher . Das heißt, wenn ein Thread die Auflistung durch Hinzufügen/Entfernen-Operationen ändert, während ein anderer Thread sie mithilfe der hasNext() or next()
-Methode durch einen Iterator durchläuft, schlägt der Iterator schnell aus, indem er ConcurrentModificationException
wirft. Das Fail-Fast-Verhalten von Iteratoren kann nur zur Erkennung von Fehlern verwendet werden. Die Aufzählungen, die von den Methoden von Klassen wie Hashtable, Vector zurückgegeben werden, sind nicht ausfallsicher. Dies wird durch Synchronisieren des Codeblocks innerhalb der nextElement()
-Methode erreicht, die das aktuelle Vector-Objekt sperrt, was viel Zeit kostet.
"Offiziell" sollen sie mit der Iteratorschnittstelle ähnlich sein, die zusätzliche Operationen unterstützt (z. B. Entfernen). Im Allgemeinen besteht die Tendenz zur Verwendung von Iteratoren.
Hier ist von der Enumerationsschnittstelle Javadocs :
HINWEIS: Die Funktionalität dieser Schnittstelle wird durch die .__-Funktion dupliziert. Iterator-Schnittstelle In Ergänzung, Iterator fügt optional eine Option .__ hinzu. Operation und hat eine kürzere Methode Namen. Neue Implementierungen sollten Erwägen Sie die Verwendung von Iterator Aufzählung.
Eine einfache Tatsache, die in früheren Antworten jedoch nicht erwähnt wurde, ist, dass Iterator<T>
zusammen mit Iterable<T>
zur Interpretation der for(_type_ element:collection){...}
-Struktur verwendet wird.
Es gibt drei grundlegende Unterschiede in Enumeration und Iterator
Aufzählung
1. es wird nur für die Lagaclasse verwendet (zB Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. Leseoperation kann durchgeführt werden, Element kann nicht entfernt werden.
3. Zwei Methoden stehen zur Verfügung
Iterator
es gilt für alle Sammlungen
Iterator itr = c.iterator();
where c is any `Collection` class
Lese- und Entfernen-Vorgang kann ausgeführt werden
Drei Methoden stehen zur Verfügung
Begrenzung in beiden
Add object
und Replace object
Wenn Sie Ihre eigene Collection-Klasse schreiben und eine der vorhandenen Klassen erweitern oder eine der Schnittstellen des Collections-Frameworks implementieren, haben Sie grundsätzlich keine andere Wahl, als Iterator zu verwenden.
Wenn Sie aus irgendeinem Grund (den ich mir nicht vorstellen kann) eine benutzerdefinierte Collection-Klasse erstellen, die sich in keiner Weise auf Java.util.Collection oder Java.util.Map bezieht, sollten Sie still Iterable implementieren So können die Leute Ihre Klasse für Schleifen verwenden.
Der Hauptunterschied ist, dass Enumeration remove () -Methode nicht verfügbar macht. Darüber hinaus erlaubt Iterator keine gleichzeitige Navigation und Änderung an einem zugrunde liegenden Objekt. Sie haben eine Kontrolle, um zu sehen, ob gleichzeitige Änderungen vorhanden sind, und benötigen daher mehr Verarbeitungsaufwand. Die Leistung von Enumeration ist also fast 50% schneller als der Iterator. Wenn wir nur eine Navigation benötigen, die eine solche Synchronisation ignoriert, verwenden Sie einfach Enumeration.
Die Aufzählung kann nur für die ältere Klasse (Vector, Stack ...) verwendet werden, während Iterator für alle verwendet werden kann.