Qual è la differenza esatta tra queste due interfacce? Ha Enumeration
vantaggi rispetto all'uso Iterator
? Se qualcuno potesse elaborare, sarebbe apprezzato un articolo di riferimento.
Qual è la differenza esatta tra queste due interfacce? Ha Enumeration
vantaggi rispetto all'uso Iterator
? Se qualcuno potesse elaborare, sarebbe apprezzato un articolo di riferimento.
Risposte:
Guardando la specifica dell'API Java per l' Iterator
interfaccia, c'è una spiegazione delle differenze tra Enumeration
:
Gli iteratori differiscono dalle enumerazioni in due modi:
- Gli iteratori consentono al chiamante di rimuovere elementi dalla raccolta sottostante durante l'iterazione con semantica ben definita.
- I nomi dei metodi sono stati migliorati.
La linea di fondo è, sia Enumeration
e Iterator
fornirà elementi successivi, ma Iterator
è migliorata in modo tale che i nomi dei metodi siano più brevi e abbia un remove
metodo aggiuntivo . Ecco un confronto fianco a fianco:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Come menzionato anche nelle specifiche dell'API Java, per i programmi più recenti, Iterator
dovrebbe essere preferito rispetto Enumeration
a "Iterator prende il posto dell'enumerazione nel framework delle raccolte Java". (Dalle Iterator
specifiche.)
Gli iteratori sono rapidi . cioè quando un thread cambia la collezione aggiungendo / rimuovi operazioni, mentre un altro thread la sta attraversando attraverso un iteratore usando il hasNext() or next()
metodo, l'iteratore fallisce rapidamente lanciando ConcurrentModificationException
. Il comportamento veloce degli iteratori può essere utilizzato solo per rilevare bug. Le Enumerazioni restituite dai metodi di classi come Hashtable, Vector non sono veloci che si ottengono sincronizzando il blocco di codice all'interno del nextElement()
metodo che blocca l'oggetto Vector corrente che costa molto tempo.
"Ufficialmente", dovrebbero essere simili con l'interfaccia dell'iteratore che supporta operazioni extra (es. Rimozione). In generale, la tendenza è quella di utilizzare gli iteratori.
Ecco dall'interfaccia di enumerazione javadocs :
NOTA: la funzionalità di questa interfaccia è duplicata dall'interfaccia Iterator. Inoltre, Iterator aggiunge un'operazione di rimozione facoltativa e ha nomi di metodo più brevi. Le nuove implementazioni dovrebbero prendere in considerazione l'utilizzo di Iterator rispetto all'enumerazione.
Un fatto semplice ma non menzionato nelle risposte precedenti è che Iterator<T>
viene utilizzato Iterable<T>
per servire nell'interpretazione della for(_type_ element:collection){...}
struttura.
Esistono tre differenze fondamentali in Enumeration e Iterator
Enumerazione
1. è utilizzato solo per la classe di lagacy (es. Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. L'operazione di lettura può essere eseguita, non possiamo rimuovere l'elemento.
3. Sono disponibili due metodi
Iterator
è applicabile a tutta la raccolta
Iterator itr = c.iterator();
where c is any `Collection` class
È possibile eseguire l'operazione di lettura e rimozione
Sono disponibili tre metodi
Limitazione in entrambi
Add object
eReplace object
Se stai scrivendo la tua classe di raccolta e stai estendendo una qualsiasi delle classi esistenti o implementando una qualsiasi delle interfacce del framework delle raccolte, in pratica non hai altra scelta che usare Iterator.
Se per qualche motivo (a cui non riesco a pensare) stai creando una classe di raccolta personalizzata che non è correlata a java.util.Collection o java.util.Map in alcun modo, dovresti comunque implementare Iterable in modo che le persone possano usare la tua classe in cicli for.
La differenza principale è che l'enumerazione non espone il metodo remove (). Inoltre, Iterator non consente la navigazione e la modifica contemporaneamente su un oggetto sottostante. Hanno un controllo per vedere se ci sono modifiche simultanee o giù di lì, e quindi richiede più elaborazione. Quindi le prestazioni di Enumeration sono praticamente il 50% più veloci di Iterator. Se è necessaria solo la navigazione ignorando tale sincronizzazione, è sufficiente utilizzare Enumerazione.
1) La principale differenza tra Iterator ed Enumeration è la rimozione dell'elemento durante l'attraversamento della raccolta. Iterator può rimuovere l'elemento durante l'attraversamento della raccolta poiché ha il metodo remove (). L'enumerazione non ha il metodo remove ().
2) L'enumerazione è di natura sicura. Non genera ConcurrentModificationException se Collection viene modificata durante l'attraversamento. Iterator è di natura rapida. Genera ConcurrentModificationException se una Collection viene modificata durante l'iterazione in modo diverso dal proprio metodo remove ().
3) Enumeration è un'interfaccia legacy che viene utilizzata per attraversare Vector, Hashtable. Iterator non è un'interfaccia legacy. Iterator può essere utilizzato per l'attraversamento di HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet.
Sia l'iteratore che l'enumerazione vengono utilizzati per recuperare i dati, la differenza è che l'enumerazione può essere utilizzata solo per le classi legacy, ad esempio vettore / stack, mentre gli iteratori possono essere utilizzati per il resto. L'enumerazione può essere utilizzata anche per la chiave impostata nelle mappe.