Разница между перечислением Java и итератором
какова точная разница между этими двумя интерфейсами? Делает Enumeration иметь преимущества по сравнению с использованием Iterator? Если кто-то может уточнить, будет оценена справочная статья.
9 ответов:
глядя на спецификацию Java API для
Iteratorинтерфейс, есть объяснение различий междуEnumeration:итераторы отличаются от перечисления двумя способами:
- итераторы позволяют вызывающему объекту удалять элементы из базового коллекцию во время итерации с четкая семантика.
- имена методов были усовершенствованы.
суть в том, что оба
EnumerationиIteratorдаст последовательные элементы, ноIteratorулучшен таким образом, чтобы имена методов были короче, и имеет дополнительныйremoveметод. Здесь бок-о-бок сравнения:Enumeration Iterator ---------------- ---------------- hasMoreElement() hasNext() nextElement() next() N/A remove()Как также упоминалось в спецификациях Java API, для новых программ,
Iteratorдолжно быть предпочтительнееEnumeration, поскольку " итератор занимает место перечисления в структуре коллекций Java."(От имениIteratorтехнические характеристики.)
итераторы fail-fast . т. е. когда один поток изменяет коллекцию с помощью операций добавления / удаления , а другой поток проходит через итератор с помощью
hasNext() or next()метод, итератор быстро выходит из строя, бросаяConcurrentModificationException. Быстрое поведение итераторов может использоваться только для обнаружения ошибок. Перечисления, возвращаемые методами классов, таких как Hashtable, Vector, не являются ошибочными, что достигается синхронизацией блока кода внутриnextElement()способ это блокирует текущий векторный объект, который стоит много времени.
"официально", они должны быть похожи с интерфейсом итератора, поддерживающим дополнительные операции (например, удаление). Как правило, тенденция заключается в использовании итераторов.
отсюда интерфейс перечисления javadocs:
Примечание: функциональность этого интерфейса дублируется Интерфейс итератора. Кроме того, Итератор добавляет необязательное удаление деятельность, и имеет более короткий метод имена. Новые реализации должны рассмотрите возможность использования итератора в предпочтении к перечислению.
один простой факт, но не упоминалось в предыдущих ответах является то, что
Iterator<T>используетсяIterable<T>служить в интерпретацииfor(_type_ element:collection){...}структура.
есть основные три различия в перечислении и итераторе
перечисление
1. он используется только для класса lagacy (например.Vector)Enumeration e = v.elements(); v is the object of `Vector` class2. Операция чтения может быть выполнена, мы не можем удалить элемент.
3. Доступны два метода
- public boolean hasNextElement ();
- public Object nextElement ();
итератор
он применим для всей коллекции
Iterator itr = c.iterator(); where c is any `Collection` classчтение и удаление операции можно выполнить
доступны три метода
- public boolean hasNext ();
- public Object next ();
- public void remove ();
Limition как
- двигаться только вперед направление
- нет никаких методов для
Add objectиReplace object
Если вы пишете свой собственный класс коллекции, и вы расширяете любой из существующих классов или реализуете любой из интерфейсов платформы коллекций, у вас в основном нет выбора, кроме как использовать итератор.
Если по какой-то причине (что я не могу придумать) вы создаете пользовательский класс коллекции, который не относится к java.утиль.Коллекция или java.утиль.Карта в любом случае, вы должны еще реализовать Iterable, чтобы люди могли использовать ваш класс в циклах for.
главным отличием является перечисление, которое не предоставляет метод remove (). Кроме того, итератор не допускает одновременной навигации и модификации на базовом объекте. Они имеют контроль, чтобы увидеть, если есть параллельные модификации, и, следовательно, требует больше обработки. Таким образом, производительность перечисления практически на 50% быстрее, чем у итератора. Если нам нужна только навигация, игнорирующая такую синхронизацию, просто используйте перечисление.
перечисление может использоваться только для устаревшего класса (вектор, стек...), в то время как итератор может быть использован для всех.
Как итератор, так и перечисление используются для извлечения данных, разница в том, что перечисление может использоваться только для устаревших классов, т. е. вектор/стек, тогда как итераторы могут использоваться для остальных. Перечисление также может использоваться для набора ключей в картах.
Comments