Výčet vs Iterátor
Existuje mnoho datových struktur, které fungují jako kolekce v Javě, jako jsou vektory, 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ými prvky objektů v Javě. Java poskytuje dvě rozhraní, která tento úkol usnadňují. Výčet a Iterator jsou dvě z rozhraní nalezených v balíčku java.util, která poskytují funkce pro výčet sekvencí nebo objektů se sadou položek. Enumerator byl představen v JDK 1.0 a Iterator, který byl představen v JDK 1.2, prakticky duplikuje funkčnost Enumerator (v rámci Frameworks Collection).
Co je výčet?
Výčet je veřejné rozhraní v Javě zavedené v JDK 1.0, které poskytuje možnost výčtu prostřednictvím sekvencí prvků. Nachází se pod balíčkem java.util. Když je Enumeration rozhraní implementováno objektem, může tento objekt generovat posloupnost prvků. Rozhraní výčtu má dvě metody. Metoda hasMoreElements () otestuje, zda tento výčet obsahuje více prvků a nextElement () vrací další prvek v pořadí (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 vektoru v1 pomocí Enumerátoru lze použít následující fragment kódu.
Výčet e = v1.elements ();
While (e.hasMoreLements ()) {
System.out.println (e.nextElement ());
}
Enumerátor lze také použít k definování proudu vstupu do objektů SequenceInputStream.
Co je Iterator?
Iterator je veřejné rozhraní v balíčku Java.util, které umožňuje iteraci prostřednictvím prvků objektů kolekcí, které implementují framework kolekce (například 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 v kolekci existují zbývající prvky, a metoda next () vrací další prvek v řadě. Metodu remove () lze použít k odebrání aktuálního prvku ze základní kolekce. Například pro tisk všech prvků ve Vectoru v1 pomocí Iterátoru 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 Enumeration a Iterator?
Ačkoli Enumeration a Iterator jsou dvě z rozhraní nalezených v balíčku java.util, která umožňují iteraci / výčet prostřednictvím prvků řady, mají své rozdíly. Ve skutečnosti Iterator, který byl zaveden po výčtu, nahradí výčet v rámci kolekce Java. Na rozdíl od výčtu je Iterator bezpečný proti selhání. To znamená, že souběžné úpravy (podkladové kolekce) nejsou povoleny, když se použije Iterator. To je velmi užitečné v prostředích s více podprocesy, kde vždy existuje riziko souběžných úprav. V případě souběžné úpravy Iterator objekt vyvolá ConcurrentModificationException. Iterator má ve srovnání s Enumeratorem kratší názvy metod. Dáleiterátor má další funkce mazání prvků během iterace (což pomocí Enumerátoru není možné). Takže pokud je potřeba odebrat prvky z kolekce, je Iterator jedinou možností, kterou lze vzít v úvahu.