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.
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.
Odpowiedzi:
Patrząc na specyfikację interfejsu API języka Java dla Iterator
interfejsu, wyjaśniono różnice między Enumeration
:
Iteratory różnią się od wyliczeń na dwa sposoby:
- Iteratory umożliwiają wywołującemu usuwanie elementów z podstawowej kolekcji podczas iteracji z dobrze zdefiniowaną semantyką.
- Nazwy metod zostały poprawione.
Najważniejsze jest to, że oba Enumeration
i Iterator
będą dawać kolejne elementy, ale Iterator
jest ulepszony w taki sposób, że nazwy metod są krótsze i ma dodatkową remove
metodę. Oto porównanie side-by-side:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Jak wspomniano również w specyfikacji interfejsu API języka Java, w przypadku nowszych programów Iterator
powinno być preferowane Enumeration
, ponieważ „Iterator zastępuje wyliczanie w strukturze kolekcji Java”. (Ze Iterator
specyfikacji.)
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 wyrzucanie ConcurrentModificationException
. 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ątrz nextElement()
metody, która blokuje bieżący obiekt Vector, co kosztuje dużo czasu.
"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 :
UWAGA: Funkcjonalność tego interfejsu jest dublowana przez interfejs Iteratora. Ponadto Iterator dodaje opcjonalną operację usuwania i ma krótsze nazwy metod. Nowe implementacje powinny rozważyć użycie Iteratora zamiast wyliczenia.
Jednym prostym faktem, o którym nie wspomniano w poprzednich odpowiedziach, jest to, że Iterator<T>
służy Iterable<T>
do interpretacji for(_type_ element:collection){...}
struktury.
Istnieją trzy podstawowe różnice w wyliczaniu i iteratorze
Wyliczenie
1. jest używane tylko dla klasy lagacy (np. Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. Można wykonać operację odczytu, nie możemy usunąć elementu.
3. Dostępne są dwie metody
Iterator
ma zastosowanie do wszystkich kolekcji
Iterator itr = c.iterator();
where c is any `Collection` class
Można wykonać operację odczytu i usuwania
Dostępne są trzy metody
Ograniczenie w obu
Add object
iReplace object
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.
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.
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.
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.