почему итератор все еще существует в Java - PullRequest
1 голос
/ 12 июля 2011

Насколько мне известно, основное различие между Iterator и ListIterator заключается в

Iterator: Позволяет циклически проходить по коллекции только в прямом направлении, для получения или удаления элементов

ListIterator: Он расширяет Iterator, разрешает двунаправленный обход списка и модификацию элементов

Если ListIterator более мощный, чем Iterator, тогда разработчик Sun Java должен обеспечить реализацию только для ListIterator иосудить итератор.Почему Iterator все еще существует в Java?Есть ли преимущество использования Iterator по сравнению с ListIterator?

Ответы [ 4 ]

12 голосов
/ 12 июля 2011

Это потому, что не все коллекции поддерживают прямую и обратную итерацию.ListIterators специально для коллекций, которые имеют семантику списка, то есть они определяют порядок элементов.Некоторые типы коллекций (например, Sets) не определяют порядок своих элементов, поэтому ListIterator для них не имеет смысла.

Есть также дополнительные издержкивозникает, когда реализация итератора должна поддерживать достаточно состояния, чтобы поддерживать прямую и обратную итерацию и модификацию на месте.Поддерживая как Iterator, так и ListIterator, можно получить облегченную реализацию Iterator, когда это необходимо, и более тяжелую ListIterator для тех случаев, когда требуется дополнительная функциональность.

6 голосов
/ 12 июля 2011

То, что что-то может сделать больше, не делает его подходящим инструментом для работы.

В случае Iterator против ListIterator не каждая коллекция нуждается в поддержке двунаправленной итерации. Кроме того, количество мутирующей способности, которой обладает ListIterator, не обязательно подходит для общей итерации. Наконец, ListIterator предоставляет способы доступа к индексу элемента, но многие коллекции не имеют понятия индекса. Таким образом, можно сказать, что ListIterator слишком мощный для большинства коллекций. Фактически, некоторые люди уже могут считать Iterator «слишком мощным», поскольку он предоставляет метод remove, который тоже не всегда уместен.

Основным направляющим фактором здесь является часть "Список" ListIterator; в то время как Iterator должен быть полезен для всех коллекций, ListIterator специально предназначен для коллекций, которые, как и списки, имеют четкое линейное упорядочение своих элементов.

Несколько примеров, где ListIterator было бы полезно:

  • Одно- и двусвязные списки
  • Списки массивов
  • Другие коллекции с четко определенным линейным порядком

Некоторые примеры, где ListIterator - это , а не подходит:

  • Деревья (многие из них, так или иначе)
  • Карты
  • Установка
  • Другая коллекция, не имеющая линейного порядка
0 голосов
/ 12 июля 2011

Это потому, что Java обратно-двоично-совместим по замыслу и замыслу, поэтому из него никогда ничего не удалялось, кроме миграции событий AWT в 1.0-> 1.1.

0 голосов
/ 12 июля 2011

Мощь ListIterator заключается в стоимости (реализации), которая была бы нетривиальной для типов коллекций, не относящихся к списку, таких как хэш-карты, наборы и т. Д. Вот почему это требуется только для коллекций, доступных по индексу в Java.рамки коллекции.Кроме того, Iterator является базовым устройством в цикле foreach в Java, и имеет смысл подкрепить такие возможности языка чем-то простым, чтобы его было легче адаптировать для более широкого диапазона типов.

...