Jaka jest dokładna różnica między tymi dwoma interfejsami? Czy Enumeration
ma korzyści z używania Iterator
? Gdyby ktokolwiek mógł się rozwinąć, należałoby zapoznać się z artykułem referencyjnym.Różnica między wyliczaniem Java a Iteratorem
Odpowiedz
Patrząc na API Specification Java dla interfejsu Iterator
, jest wyjaśnienie różnic między Enumeration
:
Iteratory różnią się od wyliczeń na dwa sposoby:
- Iteratory pozwolić rozmówcy w celu usunięcia elementów z podstawowej kolekcji podczas iteracji z dobrze zdefiniowaną semantyką.
- Poprawiono nazwy metod.
Najważniejsze jest to, że oba Enumeration
i Iterator
daje kolejne elementy, ale Iterator
poprawia się w taki sposób, nazwy metod są krótsze i ma dodatkową metodę remove
. Oto porównanie side-by-side:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
jak wspomniano również w API specyfikacji Java dla nowszych programów Iterator
powinny być preferowane nad Enumeration
, jak „Iterator ma miejsce Enumeration w zbiorach ramach Java . " (Z specyfikacji Iterator
.)
Sądzę, że brakuje pewnej ilości wyjaśnień w tej odpowiedzi dotyczącej współbieżności. –
@Paul_Draper: Zmiany nie powinny dodawać nowego znaczenia do posta, do czego służą komentarze. – Emil
@coobird Czy na pewno "Wyliczenia są zazwyczaj szybsze"? ponieważ Enumeration ma "synchronizujący blok kodu wewnątrz nextElement()" I nie mamy synchronizacji w Iteratorach, co powoduje rytualność ConcurrentModificationException? Czy nazywamy Iteratory są zazwyczaj szybsze, a wyliczenia są trochę bezpieczniejsze. ?? –
"Oficjalnie", mają być podobne z interfejsem iteratora obsługującym dodatkowe operacje (np. Usuwanie). Zasadniczo tendencją jest stosowanie iteratorów.
Oto od the enumeration interface javadocs:
UWAGA: Funkcjonalność tego interfejsu jest powielany przez interfejs Iterator. Ponadto, Iterator dodaje opcjonalną operację usunięcia i ma krótsze nazwy metod. Nowe implementacje powinny rozważyć użycie Iteratora w preferencjach do wyliczenia.
Jeśli piszesz własną klasę kolekcji i rozszerzasz którąkolwiek z istniejących klas lub implementujesz któryś z interfejsów do Kolekcji kolekcji, w zasadzie nie masz innego wyjścia, jak używać Iteratora.
Jeśli z jakiegoś powodu (że nie mogę myśleć) tworzysz klasę zwyczaj zbierania, które nie odnoszą się do java.util.Collection lub java.util.Map w jakikolwiek sposób, należy nadal implementuj Iterable, aby ludzie mogli używać twojej klasy w pętlach.
Podstawową różnicą jest wyliczenie, które nie udostępnia metody remove(). Co więcej, Iterator nie pozwala na jednoczesną nawigację i modyfikację obiektu leżącego pod spodem. Mają kontrolę, aby zobaczyć, czy są równoczesne modyfikacje, a więc więcej przetwarzania. Tak więc wydajność wyliczenia jest praktycznie o 50% szybsza od Iteratora. Jeśli potrzebujemy tylko nawigacji ignorującej taką synchronizację, wystarczy użyć wyliczenia.
To prawda, że wyliczenie "nie" ujawnia metodę remove() - ale nie zwraca też uwagi na wywołanie funkcji remove() kolekcji. Na przykład poniższy kod po prostu wydrukuje: AAA, CCC, EEE. ------------------------------------------------ ----- Wektor
Zarówno iterator, jak i wyliczenie są używane do pobierania danych. Różnica polega na tym, że wyliczanie może być używane tylko w starszych klasach, np. Wektor/stos, podczas gdy iteratory mogą być używane do dalszej obróbki. Wyliczenie może być również użyte dla zestawu kluczy w mapach.
Gdzie widziałeś, że możesz używać wyliczenia dla kluczowych zestawów mapy? – Kutzi
Iteratory są fail-szybko. tj. gdy jeden wątek zmienia kolekcję przez operacje dodawania/usuwania, podczas gdy inny wątek przechodzi przez iterator za pomocą metody hasNext() or next()
, iterator szybko się zawiesza, rzucając ConcurrentModificationException
. Szybkie działanie iteratorów może być wykorzystywane tylko do wykrywania błędów. Wyliczenia zwrócone przez metody klas takie jak Hashtable, Vector nie są odporne na awarię, co osiąga się przez zsynchronizowanie bloku kodu wewnątrz metody nextElement()
, która blokuje bieżący obiekt Vector, który kosztuje dużo czasu.
Tylko częściowo prawda: to zachowanie nie jest zdefiniowane w interfejsie, to zależy od implementacji Iteratora. To prawda, że "stare" implementacje kolekcji w java.util (HashSet, ArrayList itp.) Wykazują takie zachowanie. Jednak nowsze kolekcje "współbieżne" nigdy nie wyrzucą wyjątku ConcurrentModificationException, będą przechodzić przez kolekcję od momentu utworzenia iteratora. Inne implementacje mogą pokazywać inne zachowanie. – Kutzi
Warto również zwrócić uwagę: "Należy pamiętać, że nie można zagwarantować zachowania odpornego na awarie, ponieważ generalnie niemożliwe jest wykonanie jakichkolwiek twardych gwarancji w przypadku niezsynchronizowanej, współbieżnej modyfikacji. Szybkie działania powodują, że ConcurrentModificationException działa z najwyższą starannością. Dlatego błędem byłoby napisanie programu, który zależałby od tego wyjątku pod względem jego poprawności: ConcurrentModificationException powinien być używany tylko do wykrywania błędów. " http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html – Kutzi
Jeden prosty fakt, ale nie wspomniałem w poprzednich odpowiedziach, że Iterator<T>
jest używany z Iterable<T>
do tłumaczenia interpretacji struktury for(_type_ element:collection){...}
.
Istnieje podstawowa różnica w trzy Enumeration i Iterator
Wyliczanie
1. jest stosowanie wyłącznie lagacy klasy (np. Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. operacji odczytu można wykonać , nie możemy usunąć elementu.
3. Dwa Metoda są dostępne
- public boolean hasNextElement();
- public object nextElement();
Iterator
ma ona zastosowanie do wszystkich kolekcji
Iterator itr = c.iterator(); where c is any `Collection` class
przeczytane i Usuń operację można wykonać
Trzy metody są dostępne
- public boolean hasNext();
- obiekt publiczny następny();
- public void remove();
Limition zarówno
- poruszać się tylko do przodu w kierunku
- Nie ma żadnych metod
Add object
iReplace object
Wyliczenie może być używany tylko do spuścizny klasa (wektor, stos ...), podczas gdy Iterator może być używany dla wszystkich.
- 1. Różnica między iteratorem a strumieniem w Scali?
- 2. Java: Różnica między Class.forName a ClassLoader.loadClass
- 3. Różnica między interpreterem Java a JVM
- 4. Jaka jest różnica między apletem java FX a apletem Java?
- 5. Różnica między obiektem a *?
- 6. Różnica między jquery a $
- 7. Różnica między mapą a dyktowaniem
- 8. Różnica między String [] a i String ... a
- 9. Różnica między bip pid a $$
- 10. Różnica między kodowaniem a sortowaniem?
- 11. Różnica między onbeforeunload a onunload
- 12. Różnica między OpenCV a OpenCL
- 13. Różnica między wysokością a tłumaczeniemZ
- 14. Różnica między ApplicationInfo a PackageInfo?
- 15. Różnica między CMAKE_PROJECT_NAME a PROJECT_NAME?
- 16. Różnica między autoconf a autoreconf
- 17. Różnica między transakcją a transakcjąScope
- 18. Różnica między File.Copy a File.Move
- 19. Różnica między _declspec a __declspec?
- 20. Różnica między repozytorium a usługą?
- 21. Różnica między CCNode a CCLayer?
- 22. różnica między * y ++ a ++ * y?
- 23. Różnica między IPFS a Filecoin?
- 24. Różnica między systemem a shell_exec
- 25. Różnica między Redis a kafka
- 26. Różnica między dodawaniem a dodawaniem
- 27. Różnica między DisplayFor a ValueFor
- 28. Różnica między @EntityScan a @ComponentScan
- 29. Różnica między DataSource a DataSet
- 30. Różnica między LIST_HEAD_INIT a INIT_LIST_HEAD
Użyłem wyszukiwarki Google, a pierwszym rezultatem była interesująca dyskusja w JavaRanch na temat [Wyliczenie kontra Iterator] (http://www.coderanch.com/t/202139/Performance/java/Enumeration-vs-Iterator) –