Výčet vs Iterátor
V Javě existuje mnoho datových struktur, které fungují jako kolekce, jako jsou Vectors, Hash tabulky a třídy, které implementují Java Collections Framework (tj. HashMap, HashSet, ArrayList, TreeSet, TreeMap, LinkedList, LinkedHashMap a LinkedHashSet). Existuje mnoho způsobů, jak iterovat jednotlivé prvky objektů v Javě. Java poskytuje dvě rozhraní pro usnadnění tohoto úkolu. Enumeration a Iterator jsou dvě rozhraní nalezená v balíku java.util, která poskytují funkce pro výčet sekvencí nebo objektů se sadou položek. Enumerator byl zaveden v JDK 1.0 a Iterator, které byly představeny v JDK 1.2, virtuálně duplikují funkčnost Enumerátoru (v rámci Collections Framework).
Co je výčet?
Enumeration je veřejné rozhraní v Javě, představené v JDK 1.0, které poskytuje možnost výčtu sekvencí prvků. Nachází se v balíčku java.util. Když je rozhraní Enumeration implementováno objektem, může tento objekt generovat sekvenci prvků. Enumerační rozhraní má dvě metody. Metoda hasMoreElements() otestuje, zda tento výčet obsahuje více prvků a nextElement() vrátí další prvek v sekvenci (pokud zbývá alespoň jeden další). Jinými slovy, postupným voláním nextElement() může programátor přistupovat k jednotlivým prvkům v řadě. Například pro tisk všech prvků ve Vector v1 pomocí Enumeratoru lze použít následující fragment kódu.
Výčet e=v1.elements();
While(e.hasMoreLements()){
System.out.println(e.nextElement());
}
Enumerator lze také použít k definování toku vstupu do objektů SequenceInputStream.
Co je Iterator?
Iterátor je veřejné rozhraní v balíku Java.util, které umožňuje iteraci přes prvky objektů kolekcí, které implementují rámec kolekcí (jako je ArrayList, LinkedList atd.). To bylo představeno v JDK 1.2 a nahradilo Enumerator v rámci Java Collections Framework. Iterátor má tři metody. Metoda hasNext() testuje, zda jsou v kolekci zbývající prvky, a metoda next() vrátí další prvek v řadě. Metodu remove() lze použít k odstranění aktuálního prvku ze základní kolekce. Například pro tisk všech prvků ve Vector v1 pomocí Iteratoru lze použít následující fragment kódu.
Iterátor i=v1.elements();
While(i.hasNext()){
System.out.println(e.next());
}
Jaký je rozdíl mezi Enumerací a Iterátorem?
Přestože Enumeration a Iterator jsou dvě rozhraní nalezená v balíčku java.util, která umožňují iteraci/výčet prvků série, mají své rozdíly. Ve skutečnosti Iterator, který byl představen po Enumeration, nahrazuje Enumeration v rámci Java Collections. Na rozdíl od Enumeration je Iterator bezpečný při selhání. To znamená, že souběžné úpravy (v podkladové kolekci) nejsou při použití Iterátoru povoleny. To je velmi užitečné v prostředích s více vlákny, kde vždy existuje riziko souběžných úprav. V případě souběžné úpravy objekt Iterator vyvolá výjimku ConcurrentModificationException. Iterátor má kratší názvy metod ve srovnání s Enumerátorem. Iterátor má navíc další funkcionalitu mazání prvků během iterace (což není možné pomocí Enumerátoru). Takže pokud je potřeba odstranit prvky z kolekce, Iterator je jediná možnost, kterou lze zvážit.