Какая разница между этими двумя интерфейсами? Enumeration
имеет преимущества при использовании Iterator
? Если кто-нибудь сможет разработать, будет оценена эталонная статья.
Разница между перечислением Java и итератором
Ответ 1
Глядя на спецификацию API Java для Iterator
, есть объяснение различий между Enumeration
:
Итераторы отличаются от перечисления двумя способами:
- Итераторы позволяют вызывающему абоненту удалять элементы из основного коллекции во время итерации с четко определенная семантика.
- Имена методов были улучшены.
В нижней строке, как Enumeration
, так и Iterator
будут представлены последовательные элементы, но Iterator
улучшается таким образом, что имена методов короче и имеют дополнительный метод remove
. Вот сравнительное сравнение:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Как уже упоминалось в спецификациях Java API, для более новых программ Iterator
должно быть предпочтительнее Enumeration
, так как "Iterator заменяет Enumeration в структуре коллекций Java". (Из Iterator
.)
Ответ 2
Итераторы fail-fast. т.е. когда один поток изменяет коллекцию посредством операций добавления/удаления, в то время как другой поток пересекает его через Iterator с использованием метода hasNext() or next()
, итератор не работает быстро, бросая ConcurrentModificationException
. Неудачное поведение итераторов может использоваться только для обнаружения ошибок. Перечисления, возвращаемые методами таких классов, как Hashtable, Vector, не ускоряются, что достигается путем синхронизации блока кода внутри метода nextElement()
, который блокирует текущий векторный объект, который стоит много времени.
Ответ 3
"Официально", они должны быть похожими на интерфейс итератора, поддерживающий дополнительные операции (например, удаление). Как правило, тенденция заключается в использовании итераторов.
Вот от интерфейс перечисления javadocs:
ПРИМЕЧАНИЕ. Функциональность этого интерфейса дублируется Интерфейс итератора. К тому же, Итератор добавляет дополнительный вариант и имеет более короткий метод имена. Новые реализации должны рассмотрите возможность использования Iterator к перечислению.
Ответ 4
Один простой факт, но не упомянутый в предыдущих ответах, заключается в том, что Iterator<T>
используется с Iterable<T>
для интерпретации структуры for(_type_ element:collection){...}
.
Ответ 5
Существуют три основных различия в перечислении и итераторе
Перечисление
1. он используется только для класса lagacy (например, Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. Операция чтения может выполняться, мы не можем удалить элемент.
3. Доступны два метода
- public boolean hasNextElement();
- public Object nextElement();
Итератор
-
применим для всех Collection
Iterator itr = c.iterator(); where c is any `Collection` class
-
Операция чтения и удаления может выполняться
-
Доступны три метода
- public boolean hasNext();
- public Object next();
- public void remove();
Ограничение в
- Переместить только направление вперед
- Нет никаких методов для
Add object
иReplace object
Ответ 6
Если вы пишете свой собственный класс коллекции и расширяете любой из существующих классов или реализуете какой-либо из интерфейсов структуры коллекций, у вас в принципе нет выбора, кроме как использовать Iterator.
Если по какой-то причине (что я не могу придумать) вы создаете собственный класс коллекции, который никак не связан с java.util.Collection или java.util.Map, вы все равно должны реализовать Iterable так люди могут использовать ваш класс для циклов.
Ответ 7
Основное отличие - перечисление не выдает метод remove(). Кроме того, Iterator не позволяет одновременно осуществлять навигацию и модификацию на базовом объекте. У них есть контроль, чтобы увидеть, есть ли параллельные модификации или так, и, следовательно, требует большей обработки. Таким образом, производительность перечисления практически на 50% выше, чем у Iterator. Если нам нужна только навигация, игнорирующая такую синхронизацию, просто используйте Enumeration.
Ответ 8
Перечисление может использоваться только для унаследованного класса (Vector, Stack...), в то время как Iterator может использоваться для всех.
Ответ 9
Итератор и перечисление используются для извлечения данных, разница в том, что перечисление может использоваться только для устаревших классов i.e vector/stack, тогда как итераторы могут использоваться для остальных. Перечисление также может использоваться для набора ключей в картах.