Enumeracja a iterator
Istnieje wiele struktur danych, które działają jako kolekcje w Javie, takie jak wektory, tabele haszujące i klasy implementujące Java Collections Framework (tj. HashMap, HashSet, ArrayList, TreeSet, TreeMap, LinkedList, LinkedHashMap i LinkedHashSet). Istnieje wiele sposobów na iterację poszczególnych elementów obiektów w Javie. Java udostępnia dwa interfejsy, które ułatwiają to zadanie. Enumeration i Iterator to dwa interfejsy znajdujące się w pakiecie java.util, które zapewniają funkcjonalność wyliczania za pomocą sekwencji lub obiektów z zestawem elementów. Enumerator został wprowadzony w JDK 1.0 i Iterator, który został wprowadzony w JDK 1.2, wirtualnie powiela funkcjonalność Enumeratora (w ramach Collections Framework).
Co to jest wyliczanie?
Enumeration to publiczny interfejs w Javie, wprowadzony w JDK 1.0, który umożliwia wyliczanie poprzez sekwencje elementów. Znajduje się w pakiecie java.util. Gdy interfejs Enumeration jest implementowany przez obiekt, ten obiekt może generować sekwencję elementów. Interfejs wyliczenia ma dwie metody. Metoda hasMoreElements() sprawdzi, czy to wyliczenie zawiera więcej elementów, a nextElement() zwraca następny element w sekwencji (jeśli jest jeszcze co najmniej jeden). Innymi słowy, wywołując kolejno nextElement(), programista może uzyskać dostęp do poszczególnych elementów w serii. Na przykład, aby wydrukować wszystkie elementy w Vector v1 za pomocą Enumeratora, można użyć następującego fragmentu kodu.
Enumeracja e=v1.elements();
Podczas(e.maWięcejelementów()){
System.out.println(e.nextElement());
}
Enumerator może być również użyty do zdefiniowania strumienia danych wejściowych do obiektów SequenceInputStream.
Co to jest iterator?
Iterator to publiczny interfejs w pakiecie Java.util, który umożliwia iterację po elementach obiektów kolekcji, które implementują framework Collections (takich jak ArrayList, LinkedList itp.). Zostało to wprowadzone w JDK 1.2 i zastąpiło moduł wyliczający w ramach Java Collections Framework. Iterator ma trzy metody. Metoda hasNext() sprawdza, czy w kolekcji są pozostałe elementy, a metoda next() zwraca następny element w serii. Metoda remove() może służyć do usuwania bieżącego elementu z kolekcji bazowej. Na przykład, aby wydrukować wszystkie elementy w Vector v1 za pomocą Iteratora, można użyć następującego fragmentu kodu.
Iterator i=v1.elements();
Gdy(i.maDalej()){
System.out.println(e.next());
}
Jaka jest różnica między enumeracją a iteratorem?
Chociaż Enumeration i Iterator to dwa z interfejsów znajdujących się w pakiecie java.util, które umożliwiają iterację/wyliczanie przez elementy serii, mają one swoje różnice. W rzeczywistości Iterator, który został wprowadzony po Enumeration, zastępuje Enumeration w ramach Java Collections. W przeciwieństwie do wyliczenia Iterator jest odporny na awarie. Oznacza to, że równoczesne modyfikacje (do podstawowej kolekcji) nie są dozwolone, gdy używany jest Iterator. Jest to bardzo przydatne w środowiskach wielowątkowych, w których zawsze istnieje ryzyko współbieżnych modyfikacji. W przypadku współbieżnej modyfikacji obiekt Iterator zgłosi ConcurrentModificationException. Iterator ma krótsze nazwy metod w porównaniu do Enumeratora. Ponadto iterator posiada dodatkową funkcjonalność usuwania elementów podczas iteracji (co nie jest możliwe przy użyciu Enumeratora). Tak więc, jeśli istnieje potrzeba usunięcia elementów z kolekcji, Iterator jest jedyną opcją, którą można rozważyć.