Ответ 1
Единственная цель Итератора - перечислить через коллекцию. Все коллекции содержат метод add()
для вашей цели. Не было бы смысла добавлять к Итератору, потому что сбор может быть или не быть заказан (в случае HashSet
).
EDIT: Во время работы над другой проблемой я пришел к другой причине, что Iterator
не имеет метода add()
. Глядя под капотом ArrayList
(строка 111) и HashMap
(строка 149), мы видим, что реализация - это всего лишь несколько методов, окружающих массив объектов. Теперь рассмотрим, как массивы обрабатываются в памяти.
Это массив из 5 элементов. Однако имеется шесть индексов. Буква "a" в этом массиве указана как элемент 0, потому что для ее чтения слева направо, как на компьютере, вам нужно начинать с индекса 0. Теперь, если мы итерируем через этот массив (да, но он сводится к массиву), мы начнем с индекса 0 и продолжаем индексировать 1. В этот момент в Iterator мы хотим вызвать add("f");
. На этом этапе сравните значения add()
и remove()
. remove()
оставит пространство в массиве, которое легко перепрыгнуть, потому что мы сразу можем признать, что он не является членом. С другой стороны, add()
добавит новый элемент, в котором раньше не было. Это повлияет на длину массива, который мы итерируем. Что происходит, когда мы добираемся до этого последнего элемента? Можем ли мы даже гарантировать, что он есть (то есть, массив не превысил максимальный размер)?
В общем, аргументы, так или иначе, имеют допустимые точки, но нижняя строка состоит в том, что поведение метода add()
не всегда определено во всех случаях. Sun должен был сделать выбор, чтобы ограничить функциональность, и они решили не включать этот метод.