Какова точная разница между этими двумя интерфейсами? Имеет ли Enumeration
преимущества перед использованием Iterator
? Если кто-то может уточнить, справочная статья будет оценена.
Разница между перечислением Java и итератором
Ответы (10)
Просмотр спецификации Java API для Iterator
интерфейс, есть объяснение различий между Enumeration
а>:
Итераторы отличаются от перечислений двумя способами:
- Итераторы позволяют вызывающему объекту удалять элементы из базовой коллекции во время итерации с четко определенной семантикой.
- Имена методов были улучшены.
Суть в том, что и Enumeration
, и Iterator
будут давать последовательные элементы, но Iterator
улучшили имена методов, сократив многословие, и у него есть дополнительный метод remove
. Вот параллельное сравнение:
Enumeration Iterator
---------------- ----------------
hasMoreElements() hasNext()
nextElement() next()
N/A remove()
Как также упоминается в Спецификациях Java API, для новых программ Iterator
следует предпочесть Enumeration
, поскольку Iterator занимает место Enumeration в структуре коллекций Java. (Из спецификаций Iterator
.)
Итераторы отказоустойчивы . то есть, когда один поток изменяет коллекцию с помощью операций добавления/удаления, в то время как другой поток проходит через итератор, используя метод hasNext() or next()
, итератор быстро выходит из строя, выдавая ConcurrentModificationException
. Безотказное поведение итераторов можно использовать только для обнаружения ошибок. Перечисления, возвращаемые методами таких классов, как Hashtable, Vector, не являются отказоустойчивыми, что достигается за счет синхронизации блока кода внутри метода nextElement()
, который блокирует текущий объект Vector, что требует много времени.
«Официально» они должны быть похожи на интерфейс итератора, поддерживающий дополнительные операции (например, удаление). Как правило, тенденция заключается в использовании итераторов.
Вот из интерфейса перечисления javadocs:
ПРИМЕЧАНИЕ. Функции этого интерфейса дублируются интерфейсом Iterator. Кроме того, Iterator добавляет необязательную операцию удаления и имеет более короткие имена методов. В новых реализациях следует рассмотреть возможность использования Iterator вместо Enumeration.
Один простой факт, но не упомянутый в предыдущих ответах, заключается в том, что Iterator<T>
используется с Iterable<T>
для интерпретации структуры for(_type_ element:collection){...}
.
Существует три основных различия в перечислении и итераторе.
Перечисление
1. используется только для устаревшего класса (например, Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. Можно выполнить операцию чтения, мы не можем удалить элемент.
3. Доступны два метода.
- общественное логическое значение hasNextElement();
- общественный объект nextElement();
Итератор
это применимо для всей коллекции
Iterator itr = c.iterator(); where c is any `Collection` class
Операция чтения и удаления может быть выполнена
Доступны три метода
- public boolean hasNext();
- общественный объект следующий();
- публичная пустота удалить();
Ограничение в обоих
- Двигаться только вперед
- Нет никаких методов для
Add object
иReplace object
1) Основное различие между Iterator и Enumeration заключается в удалении элемента при обходе коллекции. Итератор может удалить элемент во время обхода коллекции, так как у него есть метод remove(). Перечисление не имеет метода remove().
2) Перечисление носит отказоустойчивый характер. Он не генерирует исключение ConcurrentModificationException, если коллекция изменяется во время обхода. Итератор по своей природе отказоустойчив. Он выдает ConcurrentModificationException, если коллекция изменяется во время итерации, отличной от ее собственного метода remove().
3) Enumeration — это устаревший интерфейс, который используется для обхода Vector, Hashtable. Iterator не является устаревшим интерфейсом. Iterator можно использовать для обхода HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet.
Если вы пишете свой собственный класс коллекции и расширяете любой из существующих классов или реализуете любой из интерфейсов инфраструктуры коллекций, у вас в основном нет другого выбора, кроме как использовать итератор.
Если по какой-то причине (я не могу придумать) вы создаете собственный класс коллекции, который никаким образом не связан с java.util.Collection или java.util.Map, вы должны все равно реализовать Iterable, чтобы люди могли использовать ваш класс в циклах for.
Основное отличие заключается в том, что Enumeration не предоставляет метод remove(). Более того, Iterator не позволяет одновременно перемещаться и модифицировать базовый объект. У них есть контроль, чтобы увидеть, есть ли одновременные модификации или около того, и, следовательно, требуется больше обработки. Таким образом, производительность Enumeration практически на 50% выше, чем у Iterator. Если нам нужна только навигация без такой синхронизации, просто используйте Enumeration.
Перечисление можно использовать только для устаревшего класса (вектор, стек...), а итератор можно использовать для всех.
Итератор, и перечисление используются для извлечения данных, разница в том, что перечисление можно использовать только для устаревших классов, т.е. вектор/стек, тогда как итераторы можно использовать для остальных. Перечисление также можно использовать для набора ключей в картах.