2009-06-04 3 views
102

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

+3

Я использовал поиск Google, и первый результат был интересным обсуждением в JavaRanch о [Enumeration vs Iterator] (http://www.coderanch.com/t/202139/Performance/java/Enumeration-vs-Iterator) –

ответ

124

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

итераторов отличаются от перечислений двух способов:

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

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

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

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

+6

Я думаю, что есть немного объяснений, отсутствующих в этом ответе относительно параллелизма. –

+0

@Paul_Draper: Редактирование не должно добавлять новое значение в сообщение, вот для чего нужны комментарии. – Emil

+2

@coobird Вы уверены, что «перечисления, как правило, быстрее»? поскольку Enumeration имеет «синхронизирующий блок кода внутри nextElement()». И у нас нет синхронизации на итераторах, которая вызывает ConcurrentModificationException rit ?? Мы называем Итераторы, как правило, быстрее, и перечисления немного более безопасны. ?? –

11

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

Вот от the enumeration interface javadocs:

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

2

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

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

2

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

+0

Верно, что перечисление «не» выставляет метод remove(), но также не обращает внимания на вызов метода remove() api. Например, следующий код будет просто печатать: AAA, CCC, EEE. ------------------------------------------------ ----- Векторный v = new Vector (6); v.add ("AAA"); v.add ("В"); v.add ("CCC"); v.add ("DDD"); v.add ("ЕЕЕ"); v.add ("FFF"); Перечисление ru = v.elements(); while (en.hasMoreElements()) Строковое значение = (String) en.nextElement(); System.out.println (значение); v.remove (значение); – javauser71

-1

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

+0

Где вы видели, что вы можете использовать Enumeration для наборов ключей Map? – Kutzi

31

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

+4

Отчасти верно: это поведение не определено в интерфейсе, это зависит от реализации Iterator. Это правда, что «старые» реализации коллекции в java.util (HashSet, ArrayList и т. Д.) Демонстрируют такое поведение. Однако новые «параллельные» коллекции никогда не будут вызывать ConcurrentModificationException, они будут пересекать коллекцию с момента создания итератора. Другие реализации могут демонстрировать другое поведение. – Kutzi

+0

Также стоит отметить: «Обратите внимание на то, что не может быть гарантировано отказоустойчивое поведение, поскольку, как правило, невозможно сделать какие-либо серьезные гарантии при наличии несинхронизированной параллельной модификации. Неудачные операции бросают ConcurrentModificationException с максимальной эффективностью. Поэтому было бы неправильно писать программу, зависящую от этого исключения за ее правильность: ConcurrentModificationException следует использовать только для обнаружения ошибок ». http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html – Kutzi

6

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

4

Существует основная разница в три Перечисления и итератора

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

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

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

  • общественного логический hasNextElement();
  • public Object nextElement();

Итератор

  1. это применимо для всех Коллекция

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

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

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

Limition в обоих

  • двигаться только вперед в направлении
  • Там нет каких-либо методов Add object и Replace object
0

Перечень может быть использован только для наследство class (Vector, Stack ...), в то время как Итератор может использоваться для всех.