В чем точная разница между этими двумя интерфейсами? Есть ли Enumeration
преимущества перед употреблением Iterator
? Если бы кто-нибудь мог уточнить, была бы признательна справочная статья.
java
collections
iterator
enumeration
cometta
источник
источник
Ответы:
Взглянув на спецификацию Java API для
Iterator
интерфейса, можно найти объяснение различий междуEnumeration
:Суть в том, что оба
Enumeration
иIterator
будут давать последовательные элементы, ноIterator
улучшены таким образом, что имена методов короче, и есть дополнительныйremove
метод. Вот параллельное сравнение:Как также упоминается в Спецификациях Java API, более новым программам
Iterator
следует отдавать предпочтениеEnumeration
, поскольку «Iterator занимает место Enumeration в структуре коллекций Java». (ИзIterator
спецификации.)источник
Итераторы работают без сбоев . то есть, когда один поток изменяет коллекцию, добавляя / удаляя операции, в то время как другой поток просматривает ее через Iterator, используя
hasNext() or next()
метод, итератор быстро выходит из строя, выбрасываяConcurrentModificationException
. Безотказное поведение итераторов можно использовать только для обнаружения ошибок. Перечисления, возвращаемые методами таких классов, как Hashtable, Vector, не работают без сбоев, что достигается за счет синхронизации блока кода внутриnextElement()
метода, который блокирует текущий объект Vector, что требует много времени.источник
«Официально» они должны быть похожи с интерфейсом итератора, поддерживающим дополнительные операции (например, удаление). Как правило, используются итераторы.
Вот из интерфейса javadocs интерфейса перечисления :
источник
Один простой факт, о котором не упоминалось в предыдущих ответах, заключается в том, что
Iterator<T>
он используетсяIterable<T>
для интерпретацииfor(_type_ element:collection){...}
структуры.источник
В Enumeration и Iterator есть три основных различия
Перечисление
1. используется только для класса задержки (например
Vector
).2. Операция чтения может быть выполнена, мы не можем удалить элемент.
3. Доступны два метода
Итератор
применимо для всей коллекции
Операция чтения и удаления может быть выполнена
Доступны три метода
Ограничение в обоих
Add object
иReplace object
источник
Если вы пишете свой собственный класс коллекции и расширяете любой из существующих классов или реализуете любой из интерфейсов платформы Collections, у вас в основном нет другого выбора, кроме как использовать Iterator.
Если по какой-то причине (о которой я не могу придумать) вы создаете собственный класс коллекции, который никак не связан с java.util.Collection или java.util.Map, вам все равно следует реализовать Iterable, чтобы люди могли использовать ваш класс в циклах for.
источник
Основное отличие заключается в том, что Enumeration не предоставляет метод remove (). Более того, Iterator не допускает одновременной навигации и модификации базового объекта. У них есть контроль, чтобы увидеть, есть ли одновременные модификации или около того, и, следовательно, требуется больше обработки. Таким образом, производительность Enumeration практически на 50% выше, чем у Iterator. Если нам нужна только навигация, игнорирующая такую синхронизацию, просто используйте Enumeration.
источник
1) Основное различие между Iterator и Enumeration - это удаление элемента при обходе коллекции. Итератор может удалить элемент во время обхода коллекции, поскольку у него есть метод remove (). В перечислении нет метода remove ().
2) Перечисление по своей природе отказоустойчиво. Он не генерирует ConcurrentModificationException, если Collection изменяется во время обхода. Итератор по своей природе отказоустойчив. Он выдает исключение ConcurrentModificationException, если Collection изменяется при итерации, отличной от собственного метода remove ().
3) Перечисление - это унаследованный интерфейс, который используется для обхода Vector, Hashtable. Итератор не является устаревшим интерфейсом. Итератор можно использовать для обхода HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet.
источник
Перечисление можно использовать только для унаследованного класса (Vector, Stack ...), а Iterator можно использовать для всех.
источник
Итератор и перечисление используются для извлечения данных, разница в том, что перечисление может использоваться только для устаревших классов, то есть вектора / стека, тогда как итераторы могут использоваться для остальных. Перечисление также можно использовать для набора ключей в картах.
источник