Was ist der genaue Unterschied zwischen diesen beiden Schnittstellen? Hat Enumeration
Vorteile gegenüber der Verwendung Iterator
? Wenn jemand näher darauf eingehen könnte, wäre ein Referenzartikel willkommen.
java
collections
iterator
enumeration
Cometta
quelle
quelle
Antworten:
In der Java-API-Spezifikation für die
Iterator
Schnittstelle werden die Unterschiede erklärt zwischenEnumeration
:Das Endergebnis ist beides
Enumeration
undIterator
gibt aufeinanderfolgende Elemente, wird jedochIterator
so verbessert, dass die Methodennamen kürzer sind und eine zusätzlicheremove
Methode haben. Hier ist ein Vergleich nebeneinander:Wie auch in den Java-API-Spezifikationen erwähnt, sollte für neuere Programme "Iterator ersetzt die Aufzählung im Java-Sammlungsframework"
Iterator
vorgezogen werdenEnumeration
. (Aus denIterator
Spezifikationen.)quelle
Iteratoren sind ausfallsicher . Das heißt, wenn ein Thread die Sammlung durch Hinzufügen / Entfernen ändert, während ein anderer Thread sie mithilfe einer
hasNext() or next()
Methode durch einen Iterator durchläuft , schlägt der Iterator durch Auslösen schnell fehlConcurrentModificationException
. Das ausfallsichere Verhalten von Iteratoren kann nur zum Erkennen von Fehlern verwendet werden. Die von den Methoden von Klassen wie Hashtable, Vector zurückgegebenen Aufzählungen sind nicht ausfallsicher. Dies wird erreicht, indem der Codeblock innerhalb dernextElement()
Methode synchronisiert wird, die das aktuelle Vector-Objekt sperrt, was viel Zeit kostet.quelle
"Offiziell" sollen sie mit der Iterator-Schnittstelle ähnlich sein, die zusätzliche Operationen unterstützt (z. B. Entfernen). Im Allgemeinen besteht die Tendenz, Iteratoren zu verwenden.
Hier ist von der Aufzählungsschnittstelle javadocs :
quelle
Eine einfache Tatsache, die in früheren Antworten noch nicht erwähnt wurde, ist, dass
Iterator<T>
sieIterable<T>
zur Interpretation vonfor(_type_ element:collection){...}
Strukturen verwendet wird.quelle
Es gibt drei grundlegende Unterschiede zwischen Aufzählung und Iterator
Aufzählung
1. Es wird nur für Verzögerungsklassen verwendet (z. B.
Vector
).2. Lesevorgang kann ausgeführt werden, Element kann nicht entfernt werden.
3. Es stehen zwei Methoden zur Verfügung
Iterator
Es gilt für alle Sammlungen
Lese- und Entfernungsvorgänge können ausgeführt werden
Es stehen drei Methoden zur Verfügung
Einschränkung in beiden
Add object
undReplace object
quelle
Wenn Sie Ihre eigene Auflistungsklasse schreiben und eine der vorhandenen Klassen erweitern oder eine der Collections-Framework-Schnittstellen implementieren, haben Sie grundsätzlich keine andere Wahl, als Iterator zu verwenden.
Wenn Sie aus irgendeinem Grund (an den ich nicht denken kann) eine benutzerdefinierte Auflistungsklasse erstellen, die sich in keiner Weise auf java.util.Collection oder java.util.Map bezieht, sollten Sie Iterable dennoch implementieren, damit Benutzer es verwenden können Ihre Klasse für Schleifen.
quelle
Der Hauptunterschied besteht darin, dass die Aufzählung die Methode remove () nicht verfügbar macht. Darüber hinaus erlaubt Iterator keine gleichzeitige Navigation und Änderung eines zugrunde liegenden Objekts. Sie können steuern, ob gleichzeitig Änderungen vorgenommen werden, und benötigen daher mehr Verarbeitung. Die Leistung von Enumeration ist also praktisch 50% schneller als die von Iterator. Wenn wir nur eine Navigation benötigen, die eine solche Synchronisation ignoriert, verwenden Sie einfach Enumeration.
quelle
1) Der Hauptunterschied zwischen Iterator und Aufzählung besteht darin, das Element beim Durchlaufen der Sammlung zu entfernen. Iterator kann das Element während des Durchlaufs der Sammlung entfernen, da es die Methode remove () hat. Die Aufzählung hat keine remove () -Methode.
2) Die Aufzählung ist ausfallsicher. Es wird keine ConcurrentModificationException ausgelöst, wenn die Sammlung während des Durchlaufs geändert wird. Iterator ist von Natur aus ausfallsicher. Es löst eine ConcurrentModificationException aus, wenn eine Sammlung geändert wird, während eine andere als die eigene remove () -Methode iteriert wird.
3) Enumeration ist eine Legacy-Schnittstelle, die zum Durchlaufen von Vector Hashtable verwendet wird. Iterator ist keine Legacy-Schnittstelle. Iterator kann zum Durchlaufen von HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet verwendet werden.
quelle
Die Aufzählung kann nur für die Legacy-Klasse (Vector, Stack ...) verwendet werden, während Iterator für alle verwendet werden kann.
quelle
Sowohl der Iterator als auch die Aufzählung werden zum Abrufen der Daten verwendet. Der Unterschied besteht darin, dass die Aufzählung nur für ältere Klassen, dh Vektor / Stapel, verwendet werden kann, während Iteratoren für den Rest verwendet werden können. Die Aufzählung kann auch für den in Karten festgelegten Schlüsselsatz verwendet werden.
quelle