Подтвердить что ты не робот

Почему в интерфейсе Итератора нет метода добавления

В Iterator Sun добавила метод удаления, чтобы удалить последний доступный элемент коллекции. Почему нет метода добавления для добавления нового элемента в коллекцию? Какие побочные эффекты он может иметь для коллекции или итератора?

4b9b3361

Ответ 1

Единственная цель Итератора - перечислить через коллекцию. Все коллекции содержат метод add() для вашей цели. Не было бы смысла добавлять к Итератору, потому что сбор может быть или не быть заказан (в случае HashSet).

EDIT: Во время работы над другой проблемой я пришел к другой причине, что Iterator не имеет метода add(). Глядя под капотом ArrayList (строка 111) и HashMap (строка 149), мы видим, что реализация - это всего лишь несколько методов, окружающих массив объектов. Теперь рассмотрим, как массивы обрабатываются в памяти.

zero-based array indexes

Это массив из 5 элементов. Однако имеется шесть индексов. Буква "a" в этом массиве указана как элемент 0, потому что для ее чтения слева направо, как на компьютере, вам нужно начинать с индекса 0. Теперь, если мы итерируем через этот массив (да, но он сводится к массиву), мы начнем с индекса 0 и продолжаем индексировать 1. В этот момент в Iterator мы хотим вызвать add("f");. На этом этапе сравните значения add() и remove(). remove() оставит пространство в массиве, которое легко перепрыгнуть, потому что мы сразу можем признать, что он не является членом. С другой стороны, add() добавит новый элемент, в котором раньше не было. Это повлияет на длину массива, который мы итерируем. Что происходит, когда мы добираемся до этого последнего элемента? Можем ли мы даже гарантировать, что он есть (то есть, массив не превысил максимальный размер)?

В общем, аргументы, так или иначе, имеют допустимые точки, но нижняя строка состоит в том, что поведение метода add() не всегда определено во всех случаях. Sun должен был сделать выбор, чтобы ограничить функциональность, и они решили не включать этот метод.

Ответ 2

Хорошо, здесь мы идем:

Ответ четко указан в проекте faq:

Почему вы не предоставляете метод Iterator.add?

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

http://docs.oracle.com/javase/1.4.2/docs/guide/collections/designfaq.html#10

Ответ 3

Если вы работаете над списком, вы можете использовать ListIterator, который предусматривает операции добавления и удаления.

Ответ 4

Я не могу думать о какой-либо теоретической причине, почему add() не мог быть включен в Iterator. Так же, как Iterator может позволить элементам удаляться из коллекции через себя, он может быть предназначен для обработки добавленных элементов одинаковым образом.

Но я скажу, что за все годы программирования на Java - более 15! - Мне никогда не нужен метод Iterator.add(). Поэтому я подозреваю, что это просто не все, что полезно.

Ответ 5

Итератор имеет указатель только на следующий элемент. где у ListIterator есть указатели на предыдущий элемент (помните, что он может перемещаться назад).