В чем точная разница между этими двумя интерфейсами? Есть ли Enumeration
преимущества перед употреблением Iterator
? Если бы кто-нибудь мог уточнить, была бы признательна справочная статья.
В чем точная разница между этими двумя интерфейсами? Есть ли Enumeration
преимущества перед употреблением Iterator
? Если бы кто-нибудь мог уточнить, была бы признательна справочная статья.
Ответы:
Взглянув на спецификацию Java API для Iterator
интерфейса, можно найти объяснение различий между Enumeration
:
Итераторы отличаются от перечислений двумя способами:
- Итераторы позволяют вызывающему объекту удалять элементы из базовой коллекции во время итерации с четко определенной семантикой.
- Названия методов были улучшены.
Суть в том, что оба Enumeration
и Iterator
будут давать последовательные элементы, но Iterator
улучшены таким образом, что имена методов короче, и есть дополнительный remove
метод. Вот параллельное сравнение:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Как также упоминается в Спецификациях Java API, более новым программам Iterator
следует отдавать предпочтение Enumeration
, поскольку «Iterator занимает место Enumeration в структуре коллекций Java». (Из Iterator
спецификации.)
Итераторы работают без сбоев . то есть, когда один поток изменяет коллекцию, добавляя / удаляя операции, в то время как другой поток просматривает ее через Iterator, используя hasNext() or next()
метод, итератор быстро выходит из строя, выбрасывая ConcurrentModificationException
. Безотказное поведение итераторов можно использовать только для обнаружения ошибок. Перечисления, возвращаемые методами таких классов, как Hashtable, Vector, не работают без сбоев, что достигается за счет синхронизации блока кода внутри nextElement()
метода, который блокирует текущий объект Vector, что требует много времени.
«Официально» они должны быть похожи с интерфейсом итератора, поддерживающим дополнительные операции (например, удаление). Как правило, используются итераторы.
Вот из интерфейса javadocs интерфейса перечисления :
ПРИМЕЧАНИЕ. Функциональные возможности этого интерфейса дублируются интерфейсом Iterator. Кроме того, Iterator добавляет необязательную операцию удаления и имеет более короткие имена методов. В новых реализациях следует рассмотреть возможность использования Iterator вместо Enumeration.
Один простой факт, о котором не упоминалось в предыдущих ответах, заключается в том, что Iterator<T>
он используется Iterable<T>
для интерпретации for(_type_ element:collection){...}
структуры.
В Enumeration и Iterator есть три основных различия
Перечисление
1. используется только для класса задержки (например Vector
).
Enumeration e = v.elements();
v is the object of `Vector` class
2. Операция чтения может быть выполнена, мы не можем удалить элемент.
3. Доступны два метода
Итератор
применимо для всей коллекции
Iterator itr = c.iterator();
where c is any `Collection` class
Операция чтения и удаления может быть выполнена
Доступны три метода
Ограничение в обоих
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.
Итератор и перечисление используются для извлечения данных, разница в том, что перечисление может использоваться только для устаревших классов, то есть вектора / стека, тогда как итераторы могут использоваться для остальных. Перечисление также можно использовать для набора ключей в картах.