Подтвердить что ты не робот

Разница между перечислением Java и итератором

Какая разница между этими двумя интерфейсами? Enumeration имеет преимущества при использовании Iterator? Если кто-нибудь сможет разработать, будет оценена эталонная статья.

4b9b3361

Ответ 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, тогда как итераторы могут использоваться для остальных. Перечисление также может использоваться для набора ключей в картах.