Разница между перечислением Java и итератором - PullRequest
110 голосов
/ 04 июня 2009

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

Ответы [ 9 ]

135 голосов
/ 04 июня 2009

Если посмотреть на спецификацию Java API для интерфейса Iterator, то есть объяснение различий между Enumeration:

Итераторы отличаются от перечисления двумя способами:

  • Итераторы позволяют вызывающей стороне удалять элементы из нижележащего сбор во время итерации с четко определенная семантика.
  • Имена методов были улучшены.

Суть в том, что и Enumeration, и Iterator дадут последовательные элементы, но Iterator улучшен таким образом, что имена методов короче, и имеет дополнительный метод remove. Вот параллельное сравнение:

  Enumeration                     Iterator
  ----------------                ----------------
  hasMoreElement()                hasNext()
  nextElement()                   next()
  N/A                             remove()

Как также упомянуто в Спецификациях API Java, для более новых программ предпочтение должно быть отдано Iterator, а не Enumeration, поскольку «Итератор занимает место перечисления в структуре коллекций Java». (Из Iterator спецификаций.)

35 голосов
/ 26 октября 2012

Итераторы fail-fast . то есть, когда один поток изменяет коллекцию с помощью операций добавления / удаления, в то время как другой поток обходит ее через итератор, используя метод hasNext() or next(), итератор быстро завершается с ошибкой, выдав ConcurrentModificationException. Отказоустойчивое поведение итераторов может использоваться только для обнаружения ошибок. Перечисления, возвращаемые методами классов, таких как Hashtable, Vector, не работают быстро, что достигается путем синхронизации блока кода внутри метода nextElement(), который блокирует текущий объект Vector, который стоит много времени.

11 голосов
/ 04 июня 2009

«Официально», они должны быть похожи на интерфейс итератора, поддерживающий дополнительные операции (например, удаление). Обычно существует тенденция использовать итераторы.

Вот от интерфейс перечисления javadocs :

ПРИМЕЧАНИЕ. Функциональность этого интерфейса дублируется Интерфейс итератора. К тому же, Iterator добавляет необязательное удаление операция, и имеет более короткий метод имена. Новые реализации должны рассмотреть возможность использования итератора в настройках Перечень.

6 голосов
/ 26 февраля 2013

Один простой факт, но не упомянутый в предыдущих ответах, заключается в том, что Iterator<T> используется с Iterable<T> для интерпретации структуры for(_type_ element:collection){...}.

5 голосов
/ 23 февраля 2016

Существует три основных различия в перечислении и итераторе

Перечисление
1. используется только для класса задержки (например, Vector)

    Enumeration e = v.elements();  
    v is the object of `Vector` class

2. Операцию чтения можно выполнить, мы не можем удалить элемент.
3. Два метода доступны

  • public boolean hasNextElement ();
  • публичный объект nextElement ();

Итератор

  1. применимо для всей коллекции

    Iterator itr = c.iterator();  
    where c is any `Collection` class
    
  2. Операция чтения и удаления может быть выполнена

  3. Доступны три метода

    • public boolean hasNext ();
    • public Object next ();
    • public void remove ();

Ограничение в обоих

  • двигаться только вперед
  • Нет никаких методов для Add object и Replace object
2 голосов
/ 10 марта 2012

Основным отличием является то, что Enumeration не предоставляет метод remove (). Более того, Iterator не позволяет одновременно выполнять навигацию и модификацию базового объекта. У них есть контроль, чтобы увидеть, есть ли одновременные модификации или около того, и, следовательно, требует больше обработки. Таким образом, производительность Enumeration практически на 50% выше, чем у Iterator. Если нам нужна только навигация, игнорирующая такую ​​синхронизацию, просто используйте перечисление.

2 голосов
/ 04 июня 2009

Если вы пишете свой собственный класс коллекции, и вы расширяете какой-либо из существующих классов или реализуете какой-либо из интерфейсов платформы Collections, у вас в основном нет другого выбора, кроме как использовать Iterator.

Если по какой-то причине (которую я не могу придумать) вы создаете пользовательский класс коллекции, который никак не связан с java.util.Collection или java.util.Map, вы должны по-прежнему реализует Iterable, чтобы люди могли использовать ваш класс для циклов.

0 голосов
/ 04 сентября 2016

Перечисление может использоваться только для унаследованного класса (Vector, Stack ...), в то время как Iterator может использоваться для всех.

0 голосов
/ 17 августа 2012

Итератор и перечисление используются для извлечения данных, разница состоит в том, что перечисление может использоваться только для унаследованных классов, т.е. вектора / стека, тогда как итераторы могут использоваться для остальных. Перечисление также можно использовать для набора ключей в картах.

...