Jaka jest dokładna różnica między tymi dwoma interfejsami? Czy Enumeration
ma zalety w stosunku do używania Iterator
? Gdyby ktokolwiek mógł to rozwinąć, byłby wdzięczny za artykuł referencyjny.
java
collections
iterator
enumeration
cometta
źródło
źródło
Odpowiedzi:
Patrząc na specyfikację interfejsu API języka Java dla
Iterator
interfejsu, wyjaśniono różnice międzyEnumeration
:Najważniejsze jest to, że oba
Enumeration
iIterator
będą dawać kolejne elementy, aleIterator
jest ulepszony w taki sposób, że nazwy metod są krótsze i ma dodatkowąremove
metodę. Oto porównanie side-by-side:Jak wspomniano również w specyfikacji interfejsu API języka Java, w przypadku nowszych programów
Iterator
powinno być preferowaneEnumeration
, ponieważ „Iterator zastępuje wyliczanie w strukturze kolekcji Java”. (ZeIterator
specyfikacji.)źródło
Iteratory działają szybko . tj. gdy jeden wątek zmienia kolekcję przez operacje dodawania / usuwania, podczas gdy inny wątek przechodzi przez nią przez Iterator przy użyciu
hasNext() or next()
metody, iterator szybko kończy się niepowodzeniem przez wyrzucanieConcurrentModificationException
. Bezawaryjne zachowanie iteratorów może być używane tylko do wykrywania błędów. Wyliczenia zwracane przez metody klas, takich jak Hashtable, Vector nie są szybkie, co jest osiągane przez synchronizację bloku kodu wewnątrznextElement()
metody, która blokuje bieżący obiekt Vector, co kosztuje dużo czasu.źródło
"Oficjalnie" mają być podobne z interfejsem iteratora obsługującym dodatkowe operacje (np. Usuwanie). Ogólnie rzecz biorąc, istnieje tendencja do używania iteratorów.
Oto z interfejsu wyliczania javadocs :
źródło
Jednym prostym faktem, o którym nie wspomniano w poprzednich odpowiedziach, jest to, że
Iterator<T>
służyIterable<T>
do interpretacjifor(_type_ element:collection){...}
struktury.źródło
Istnieją trzy podstawowe różnice w wyliczaniu i iteratorze
Wyliczenie
1. jest używane tylko dla klasy lagacy (np.
Vector
)2. Można wykonać operację odczytu, nie możemy usunąć elementu.
3. Dostępne są dwie metody
Iterator
ma zastosowanie do wszystkich kolekcji
Można wykonać operację odczytu i usuwania
Dostępne są trzy metody
Ograniczenie w obu
Add object
iReplace object
źródło
Jeśli piszesz własną klasę kolekcji i rozszerzasz dowolną z istniejących klas lub implementujesz dowolny z interfejsów struktury kolekcji, w zasadzie nie masz innego wyboru, jak tylko użyć Iteratora.
Jeśli z jakiegoś powodu (o którym nie mam pojęcia) tworzysz niestandardową klasę kolekcji, która w żaden sposób nie jest związana z java.util.Collection ani java.util.Map, nadal powinieneś zaimplementować Iterable, aby ludzie mogli używać Twoja klasa w pętli for.
źródło
Główną różnicą jest to, że wyliczenie nie ujawnia metody remove (). Co więcej, Iterator nie pozwala na jednoczesną nawigację i modyfikację bazowego obiektu. Mają kontrolę, aby sprawdzić, czy istnieją równoległe modyfikacje, a zatem wymagają więcej przetwarzania. Więc wydajność Enumeration jest praktycznie o 50% szybsza niż Iterator. Jeśli potrzebujemy tylko nawigacji ignorującej taką synchronizację, po prostu użyj Enumeration.
źródło
1) Główną różnicą między Iteratorem a Enumeration jest usunięcie elementu podczas przeglądania kolekcji. Iterator może usunąć element podczas przeglądania kolekcji, ponieważ ma metodę remove (). Wyliczenie nie ma metody remove ().
2) Wyliczenie jest z natury bezpieczne. Nie zgłasza ConcurrentModificationException, jeśli Collection zostanie zmodyfikowana podczas przechodzenia. Iterator jest z natury odporny na awarie. Zgłasza ConcurrentModificationException, jeśli Collection zostanie zmodyfikowana podczas iteracji innej niż jej własna metoda remove ().
3) Enumeration to starszy interfejs, który jest używany do przechodzenia przez Vector, Hashtable. Iterator nie jest starszym interfejsem. Iterator może być używany do przechodzenia przez HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet.
źródło
Wyliczenie może być używane tylko dla starszych klas (Vector, Stack ...), podczas gdy Iterator może być używany dla wszystkich.
źródło
Zarówno iterator, jak i wyliczenie są używane do pobierania danych, różnica polega na tym, że wyliczenie może być używane tylko dla starszych klas, tj. Wektor / stos, podczas gdy iteratory mogą być używane do reszty. Wyliczenie można również zastosować dla klucza ustawionego w mapach.
źródło