Яка точна різниця між цими двома інтерфейсами? Чи 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
, оскільки "Ітератор займає місце перерахування в рамках колекцій Java". (Із Iterator
специфікацій.)
Ітератори виходять з ладу . наприклад, коли один потік змінює колекцію операціями додавання / видалення, а інший потік проходить через Ітератор hasNext() or next()
методом, ітератор швидко виходить з ладу ConcurrentModificationException
. Невдала поведінка ітераторів може використовуватися лише для виявлення помилок. Перерахування, повернені методами класів на зразок Hashtable, Vector, не є швидкими, що досягається синхронізацією блоку коду всередині nextElement()
методу, який блокує поточний об'єкт Vector, який коштує багато часу.
"Офіційно" вони повинні бути подібними до інтерфейсу ітератора, який підтримує додаткові операції (наприклад, видалення). Як правило, тенденція до використання ітераторів.
Ось з інтерфейсу перерахування javadocs :
ПРИМІТКА. Функціонал цього інтерфейсу дублюється інтерфейсом Iterator. Крім того, Iterator додає необов'язкову операцію видалення та має більш короткі назви методів. Новим реалізаціям слід розглянути можливість використання Iterator у перевазі «Перерахування».
Один простий факт, але не згадуваний у попередніх відповідях - це те, що Iterator<T>
використовується Iterable<T>
для того, щоб слугувати при тлумаченні for(_type_ element:collection){...}
структури.
Існує три основні відмінності в Перерахуванні та Ітераторі
Перерахування
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, щоб люди могли використовувати ваш клас для циклів.
Основне відмінність - це перерахування не викриває метод delete (). Крім того, Iterator не дозволяє одночасно переходити та змінювати базовий об'єкт. Вони мають контроль, щоб побачити, чи є одночасні модифікації чи так, і тому потрібно більше обробки. Тож продуктивність Enumeration практично на 50% швидша, ніж Iterator. Якщо нам потрібна лише навігація, ігноруючи таку синхронізацію, просто використовуйте Перерахування.
1) Основна відмінність Ітератора від Перерахування - це видалення елемента під час проходження колекції. Ітератор може видалити елемент під час обходу колекції так, як він має метод delete (). Перерахування не має методу remove ().
2) Перерахування є безпечним за своєю суттю. Він не кидає ConcurrentModificationException, якщо колекція буде змінена під час обходу. Ітератор невдалий за своєю природою. Він кидає ConcurrentModificationException, якщо колекцію модифікують під час ітерації, відмінного від її власного методу delete ().
3) Перерахування - це застарілий інтерфейс, який використовується для переходу Vector, Hashtable. Ітератор не є застарілим інтерфейсом. Ітератор можна використовувати для обходу HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet.
Як ітератор, так і перерахування використовуються для отримання даних, різниця полягає в тому, що перерахування може використовуватися лише для застарілих класів, тобто вектор / стек, тоді як ітератори можуть бути використані для решти. Перерахування також може використовуватися для ключа, встановленого в картах.