¿Cuál es la diferencia exacta entre estas dos interfaces? ¿ Enumeration
Tiene beneficios sobre el uso Iterator
? Si alguien pudiera dar más detalles, se agradecería un artículo de referencia.
¿Cuál es la diferencia exacta entre estas dos interfaces? ¿ Enumeration
Tiene beneficios sobre el uso Iterator
? Si alguien pudiera dar más detalles, se agradecería un artículo de referencia.
Respuestas:
En cuanto a la especificación de la API de Java para la Iterator
interfaz, 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 Enumeration
y Iterator
darán elementos sucesivos, pero Iterator
se ha mejorado de tal manera que los nombres de los métodos son más cortos y tienen un remove
mé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 Iterator
debe preferir Enumeration
, ya que "Iterator toma el lugar de la enumeración en el marco de las colecciones de Java". (De las Iterator
especificaciones).
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.
"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.
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.
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
Iterador
es aplicable para todas las colecciones
Iterator itr = c.iterator();
where c is any `Collection` class
Se puede realizar la operación de lectura y eliminación
Tres métodos están disponibles
Limitación en ambos
Add object
yReplace object
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.
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.
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.
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.