Изброяване срещу итератор
Има много структури от данни, които действат като колекции в Java като вектори, хеш таблици и класове, които имплементират Java Collections Framework (т.е. HashMap, HashSet, ArrayList, TreeSet, TreeMap, LinkedList, LinkedHashMap и LinkedHashSet). Има много начини за итерация през отделните елементи на обектите в Java. Java предоставя два интерфейса, за да улесни тази задача. Изброяването и итераторът са два от интерфейсите, намерени в пакета java.util, които предоставят функционалност за изброяване чрез последователности или обекти с набор от елементи. Изброителят беше въведен в JDK 1.0 и Iterator, който беше въведен в JDK 1.2, на практика дублира функционалността на Enumerator (в рамките на Collections Framework).
Какво е изброяване?
Enumeration е публичен интерфейс в Java, въведен в JDK 1.0, който предоставя възможност за изброяване чрез последователности от елементи. Намира се в пакета java.util. Когато интерфейсът за изброяване е имплементиран от обект, този обект може да генерира последователност от елементи. Интерфейсът за изброяване има два метода. Методът hasMoreElements() ще тества дали това изброяване съдържа повече елементи и nextElement() връща следващия елемент в последователността (ако има поне още един). С други думи, чрез последователно извикване на nextElement(), програмистът може да получи достъп до отделните елементи в серията. Например, за да отпечатате всички елементи във Vector v1 с помощта на Enumerator, може да се използва следният кодов фрагмент.
Изброяване e=v1.elements();
While(e.hasMoreLements()){
System.out.println(e.nextElement());
}
Enumerator може също да се използва за дефиниране на потока от входни данни към обектите SequenceInputStream.
Какво е итератор?
Iterator е публичен интерфейс в пакета Java.util, който позволява итерация през елементи от обектите на колекциите, които имплементират рамката на колекциите (като ArrayList, LinkedList и др.). Това беше въведено в JDK 1.2 и замени Enumerator в рамките на Java Collections Framework. Итераторът има три метода. Методът hasNext() тества дали има останали елементи в колекцията, а методът next() връща следващия елемент в серията. Методът remove() може да се използва за премахване на текущия елемент от основната колекция. Например, за да отпечатате всички елементи във Vector v1 с помощта на Iterator, може да се използва следният кодов фрагмент.
Итератор i=v1.elements();
While(i.hasNext()){
System.out.println(e.next());
}
Каква е разликата между изброяване и итератор?
Въпреки че Enumeration и Iterator са два от интерфейсите, открити в пакета java.util, които позволяват повторение/изброяване на елементи от серия, те имат своите разлики. Всъщност Iterator, който беше въведен след Enumeration, замества Enumeration в рамките на Java Collections. За разлика от Enumeration, Iterator е безопасен. Това означава, че едновременните модификации (на основната колекция) не са разрешени, когато се използва Iterator. Това е много полезно в многонишкови среди, където винаги има риск от едновременни модификации. В случай на едновременна модификация, обектът Iterator ще хвърли ConcurrentModificationException. Iterator има по-кратки имена на методи в сравнение с Enumerator. Освен това итераторът има допълнителна функционалност за изтриване на елементи по време на итерацията (което не е възможно при използване на Enumerator). Така че, ако има нужда от премахване на елементи от колекцията, Iterator е единствената опция, която може да се обмисли.