Diferencia entre enumeración e iterador de Java

Respuestas:

142

En cuanto a la especificación de la API de Java para la Iteratorinterfaz, hay una explicación de las diferencias entre Enumeration:

Los iteradores se diferencian de las enumeraciones de dos maneras:

  • Los iteradores permiten al llamador eliminar elementos de la colección subyacente durante la iteración con una semántica bien definida.
  • Se han mejorado los nombres de los métodos.

La conclusión es que ambos Enumerationy Iteratordarán elementos sucesivos, pero Iteratorse ha mejorado de tal manera que los nombres de los métodos son más cortos y tienen un removemétodo adicional . Aquí hay una comparación lado a lado:

  Enumeration                     Iterator
  ----------------                ----------------
  hasMoreElement()                hasNext()
  nextElement()                   next()
  N/A                             remove()

Como también se menciona en las Especificaciones de la API de Java, para los programas más nuevos, se Iteratordebe preferir Enumeration, ya que "Iterator toma el lugar de la enumeración en el marco de las colecciones de Java". (De las Iteratorespecificaciones).

coobird
fuente
9
Creo que falta una pequeña explicación en esta respuesta con respecto a la concurrencia.
Maarten Bodewes
@Paul_Draper: Las ediciones no deberían agregar un nuevo significado a la publicación, para eso están los comentarios.
Emil
2
@coobird ¿Estás seguro de que "Las enumeraciones suelen ser más rápidas"? ya que Enumeration tiene "bloque de código de sincronización dentro del nextElement ()" Y no tenemos Sincronización en los iteradores que causa ConcurrentModificationException rit ?? Los iteradores que llamamos son normalmente más rápidos y las enumeraciones son un poco más seguras. ??
Kanagavelu Sugumar
@KanagaveluSugumar Gracias por señalar eso. (No noté que la discusión adicional se agregó a esta respuesta). He revertido la edición, ya que no era del todo precisa.
coobird
Creo que vale la pena señalar que remove () es un método opcional en la interfaz Iterator y muchas clases de implementación no lo implementan.
Kutzi
35

Los iteradores son rápidos . es decir, cuando un hilo cambia la colección mediante operaciones de agregar / quitar, mientras que otro hilo lo atraviesa a través de un hasNext() or next()método Iterator using , el iterador falla rápidamente lanzando ConcurrentModificationException. El comportamiento a prueba de fallas de los iteradores solo se puede utilizar para detectar errores. Las enumeraciones devueltas por los métodos de clases como Hashtable, Vector no son rápidas que se logran sincronizando el bloque de código dentro del nextElement()método que bloquea el objeto Vector actual, lo que cuesta mucho tiempo.

shaILU
fuente
5
Solo parcialmente cierto: este comportamiento no está definido en la interfaz, depende de la implementación del Iterador. Es cierto que las implementaciones de la colección 'antigua' en java.util (HashSet, ArrayList, etc.) exhiben este comportamiento. Sin embargo, las colecciones 'concurrentes' más nuevas nunca lanzarán una ConcurrentModificationException, atravesarán la colección en el momento de la creación del iterador. Otras implementaciones pueden mostrar un comportamiento aún diferente.
Kutzi
1
También vale la pena señalar: "Tenga en cuenta que el comportamiento a prueba de fallos no se puede garantizar ya que, en términos generales, es imposible ofrecer garantías estrictas en presencia de modificaciones simultáneas no sincronizadas. Las operaciones de respuesta rápida generan ConcurrentModificationException sobre la base del mejor esfuerzo. Por lo tanto, , sería incorrecto escribir un programa que dependiera de esta excepción para su corrección: ConcurrentModificationException debería usarse sólo para detectar errores ". docs.oracle.com/javase/7/docs/api/java/util/…
Kutzi
11

"Oficialmente", se supone que son similares con la interfaz del iterador que admite operaciones adicionales (por ejemplo, eliminación). Generalmente, la tendencia es utilizar iteradores.

Aquí es de la interfaz de enumeración javadocs :

NOTA: La funcionalidad de esta interfaz está duplicada por la interfaz Iterator. Además, Iterator agrega una operación de eliminación opcional y tiene nombres de métodos más cortos. Las nuevas implementaciones deberían considerar el uso de Iterator en lugar de Enumeration.

Uri
fuente
6

Un hecho simple, pero que no he mencionado en respuestas anteriores, es que Iterator<T>se usa con Iterable<T>para servir en la interpretación de la for(_type_ element:collection){...}estructura.

Motor de tierra
fuente
5

Hay tres diferencias básicas en enumeración e iterador

Enumeración
1. se usa solo para la clase heredada (p. Ej. Vector)

    Enumeration e = v.elements();  
    v is the object of `Vector` class

2. Se puede realizar la operación de lectura, no podemos quitar el elemento.
3. Hay dos métodos disponibles

  • public boolean hasNextElement ();
  • objeto público nextElement ();

Iterador

  1. es aplicable para todas las colecciones

    Iterator itr = c.iterator();  
    where c is any `Collection` class
    
  2. Se puede realizar la operación de lectura y eliminación

  3. Tres métodos están disponibles

    • public boolean hasNext ();
    • objeto público siguiente ();
    • public void remove ();

Limitación en ambos

  • Mover solo hacia adelante
  • No hay ningún método para Add objectyReplace object
Vipin Jain
fuente
2

Si está escribiendo su propia clase de colección y está ampliando cualquiera de las clases existentes o implementando cualquiera de las interfaces del marco de Colecciones, básicamente no tiene más remedio que usar Iterator.

Si por alguna razón (que no puedo pensar) está creando una clase de colección personalizada que no se relaciona con java.util.Collection o java.util.Map de ninguna manera, aún debe implementar Iterable para que la gente pueda usar su clase en bucles for.

Licky Lindsay
fuente
2

La principal diferencia es que la enumeración no expone el método remove (). Además, Iterator no permite una navegación y modificación simultáneas en un objeto subyacente. Tienen un control para ver si hay modificaciones simultáneas o algo así y, por lo tanto, requieren más procesamiento. Por tanto, el rendimiento de Enumeration es prácticamente un 50% más rápido que el de Iterator. Si solo necesitamos la navegación ignorando dicha sincronización, simplemente use Enumeration.

bnguyen82
fuente
Es cierto que Enumeration "no" expone el método remove (), pero tampoco presta atención a la invocación de la API remove () de Collection. Por ejemplo, el siguiente código simplemente se imprimirá: AAA, CCC, EEE. -------------------------------------------------- --- Vector <String> v = new Vector <String> (6); v.add ("AAA"); v.add ("BBB"); v.add ("CCC"); v.add ("DDD"); v.add ("EEE"); v.add ("FFF"); Enumeración <String> en = v.elements (); while (en.hasMoreElements ()) Valor de cadena = (Cadena) en.nextElement (); System.out.println (valor); v.remove (valor);
javauser71
1

1) La principal diferencia entre Iterator y Enumeration es la eliminación del elemento mientras se recorre la colección. El iterador puede eliminar el elemento durante el recorrido de la colección, ya que tiene el método remove (). La enumeración no tiene el método remove ().

2) La enumeración es de naturaleza a prueba de fallas. No lanza ConcurrentModificationException si Collection se modifica durante el recorrido. El iterador es de naturaleza rápida. Lanza ConcurrentModificationException si se modifica una colección mientras se itera en otro método que no sea remove ().

3) La enumeración es una interfaz heredada que se utiliza para atravesar Vector, Hashtable. Iterator no es una interfaz heredada. Iterator se puede utilizar para recorrer HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet.

Dhirendra Gautam
fuente
0

La enumeración se puede usar solo para la clase heredada (Vector, Stack ...), mientras que Iterator se puede usar para todas.

Jay Sheth
fuente
-1

Tanto el iterador como la enumeración se usan para recuperar los datos, la diferencia es que la enumeración se puede usar solo para clases heredadas, es decir, vector / pila, mientras que los iteradores se pueden usar para el resto. La enumeración también se puede utilizar para el conjunto de claves en mapas.

pavan kumar
fuente
¿Dónde vio que puede usar la enumeración para conjuntos de claves de Map?
Kutzi