Różnica między wyliczaniem Javy a Iteratorem

Jaka jest dokładna różnica między tymi dwoma interfejsami? Czy Enumeration mieć korzyści z używania Iterator? Jeśli ktoś mógłby rozwinąć, artykuł referencyjny byłby mile widziany.

Author: Maarten Bodewes, 2009-06-04

9 answers

Patrząc na specyfikację Java API dlaIterator Interfejs, jest wyjaśnienie różnic między Enumeration:

Iteratory różnią się od wyliczenia na dwa sposoby:

  • Iteratory pozwalają wywoływaczowi na usunięcie elementów z bazy zbieranie podczas iteracji z dobrze zdefiniowana semantyka.
  • nazwy metod zostały ulepszone.

Podsumowując, zarówno Enumeration jak i Iterator da kolejne elementy, ale Iterator jest ulepszony w taki sposób, że 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 również wspomniano w specyfikacji Java API, dla nowszych programów, Iterator powinien być preferowany zamiast Enumeration, ponieważ "Iterator zajmuje miejsce wyliczeń w Java collections framework."(Z Iterator specyfikacje.)

 131
Author: coobird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-05 14:59:30

Iteratory są Fail-fast . np. gdy jeden wątek zmienia kolekcję za pomocą operacji Dodaj / usuń, podczas gdy inny wątek przemierza ją przez Iterator przy użyciu metody hasNext() or next(), iterator szybko zawodzi, rzucając ConcurrentModificationException. Szybkie działanie 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 osiąga się poprzez synchronizację bloku kodu wewnątrz metody nextElement(), która blokuje aktualny obiekt wektorowy, który kosztuje dużo czasu.

 33
Author: shaILU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-26 06:26:52

"oficjalnie", mają być podobne z interfejsem iteratora obsługującym dodatkowe operacje (np. usuwanie). Generalnie tendencja polega na używaniu iteratorów.

Oto z interfejs wyliczeń javadocs :

Uwaga: funkcjonalność tego interfejsu jest powielana przez Interfejs iteratora. Dodatkowo, Iterator dodaje opcjonalne usunięcie działanie i ma krótszą metodę nazwiska. Nowe wdrożenia powinny rozważ użycie iteratora w preferencje do wyliczenia.

 11
Author: Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 01:48:00

Jeden prosty fakt, ale nie wspomniano w poprzednich odpowiedziach jest to, że Iterator<T> jest używany z Iterable<T> służyć w interpretacji for(_type_ element:collection){...} struktury.

 6
Author: Earth Engine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-25 22:46:29

Istnieją trzy podstawowe różnice w wyliczeniu i Iteratorze

Wyliczenie
1. jest używany tylko dla klasy lagacy (np. Vector)

    Enumeration e = v.elements();  
    v is the object of `Vector` class

2. Operacja odczytu może być wykonana, nie możemy usunąć elementu.
3. Dostępne są dwie metody

  • public Boolean hasNextElement ();
  • public Object nextElement ();

Iterator

  1. Ma zastosowanie do wszystkich zbiorów

    Iterator itr = c.iterator();  
    where c is any `Collection` class
    
  2. Operacje odczytu i usuwania można wykonać

  3. Dostępne są trzy metody

    • public Boolean hasNext ();
    • public Object next ();
    • public void remove ();

Ograniczenie w obu

  • Przesuń tylko do przodu
  • nie ma żadnych metod dla Add object i Replace object
 5
Author: Vipin Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 11:09:43

Jeśli piszesz własną klasę collection i rozszerzasz dowolną z istniejących klas lub implementujesz dowolny interfejs Framework Collections, w zasadzie nie masz wyboru, jak tylko użyć iteratora.

Jeśli z jakiegoś powodu (o którym nie myślę) tworzysz klasę custom collection, która nie odnosi się do Javy.util.Collection lub java.util.Map w jakikolwiek sposób, powinieneś nadal zaimplementować Iterable, aby ludzie mogli używać twojej klasy w pętlach.

 2
Author: Licky Lindsay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 02:28:14

Główną różnicą jest to, że Enumeracja nie ujawnia metody remove (). Co więcej, Iterator nie pozwala na jednoczesną nawigację i modyfikację obiektu bazowego. Mają kontrolę, aby sprawdzić, czy istnieją równoczesne modyfikacje lub tak, a tym samym wymaga więcej przetwarzania. Tak więc wydajność Enumeracji jest praktycznie o 50% szybsza niż iteratora. Jeśli potrzebujemy tylko nawigacji ignorującej taką synchronizację, wystarczy użyć wyliczenia.

 2
Author: bnguyen82,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-10 10:34:40

Wyliczenie może być użyte tylko dla klasy starszej (Vector, Stack...), natomiast Iterator może być używany dla wszystkich.

 0
Author: Jay Sheth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-04 03:56:02

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 dla reszty. Wyliczanie może być również używane dla zestawu kluczy w Mapach.

 -1
Author: pavan kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-03 14:12:14