webentwicklung-frage-antwort-db.com.de

Unterschied zwischen Java Enumeration und Iterator

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.

110
cometta

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.)

133
coobird

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.

34
shaILU

"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.

11
Uri

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.

6
Earth Engine

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 

  • public boolean hasNextElement (); 
  • public Object nextElement ();

Iterator  

  1. es gilt für alle Sammlungen 

    Iterator itr = c.iterator();  
    where c is any `Collection` class
    
  2. Lese- und Entfernen-Vorgang kann ausgeführt werden

  3. Drei Methoden stehen zur Verfügung

    • public boolean hasNext ();
    • öffentliches Objekt next ();
    • public void remove ();

Begrenzung in beiden

  • Nur vorwärts bewegen
  • Es gibt keine Methoden für Add object und Replace object 
5
Vipin Jain

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.

2
Licky Lindsay

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.

2
bnguyen82

Die Aufzählung kann nur für die ältere Klasse (Vector, Stack ...) verwendet werden, während Iterator für alle verwendet werden kann. 

0
Jay Sheth