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.
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.
Antworten:
In der Java-API-Spezifikation für die Iterator
Schnittstelle werden die Unterschiede erklärt zwischen Enumeration
:
Iteratoren unterscheiden sich von Aufzählungen in zweierlei Hinsicht:
- Mit Iteratoren kann der Aufrufer während der Iteration Elemente aus der zugrunde liegenden Sammlung mit genau definierter Semantik entfernen.
- Methodennamen wurden verbessert.
Das Endergebnis ist beides Enumeration
und Iterator
gibt aufeinanderfolgende Elemente, wird jedoch Iterator
so verbessert, dass die Methodennamen kürzer sind und eine zusätzliche remove
Methode haben. Hier ist ein Vergleich nebeneinander:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Wie auch in den Java-API-Spezifikationen erwähnt, sollte für neuere Programme "Iterator ersetzt die Aufzählung im Java-Sammlungsframework" Iterator
vorgezogen werden Enumeration
. (Aus den Iterator
Spezifikationen.)
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 fehl ConcurrentModificationException
. 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 der nextElement()
Methode synchronisiert wird, die das aktuelle Vector-Objekt sperrt, was viel Zeit kostet.
"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 :
HINWEIS: Die Funktionalität dieser Schnittstelle wird von der Iterator-Schnittstelle dupliziert. Darüber hinaus fügt Iterator eine optionale Entfernungsoperation hinzu und verfügt über kürzere Methodennamen. Neue Implementierungen sollten die Verwendung von Iterator anstelle von Enumeration in Betracht ziehen.
Es gibt drei grundlegende Unterschiede zwischen Aufzählung und Iterator
Aufzählung
1. Es wird nur für Verzögerungsklassen verwendet (z. B. Vector
).
Enumeration e = v.elements();
v is the object of `Vector` class
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
Iterator itr = c.iterator();
where c is any `Collection` class
Lese- und Entfernungsvorgänge können ausgeführt werden
Es stehen drei Methoden zur Verfügung
Einschränkung in beiden
Add object
undReplace object
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.
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.
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.
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.