Сохраняет ли экземпляр Iterator, открытый для коллекции, всю коллекцию в памяти и доступ к позиции, которая увеличивается каждый раз, когда вызывается next()? Или я что-то упускаю?
Как реализованы итераторы в Java?
Ответы (3)
Реализация Iterator
зависит от конкретного Collection
это повторяется. Если вы посмотрите на исходный код JDK, например, ArrayList
и LinkedList
используют разные итераторы.
Помните, что Iterator
— это интерфейс, а не конкретный класс, поэтому он просто определяет контракт, а не реализацию.
Вообще говоря, итераторы (в зависимости от реализации) будут хранить ссылку на коллекцию и какой-то индекс, чтобы отметить, где они находятся.
Полностью зависит от реализации, но в целом (для итераторов, созданных для коллекций в памяти) итератор будет иметь ссылку на базовую коллекцию, поэтому да, он будет хранить ее в памяти.
Обратите внимание, что эта ссылка, скорее всего, не является копией, поэтому итераторы проверяют одновременные модификации коллекции, для которой они созданы.
Это полностью зависит от объекта, связанного с Iterator
. Помните, что (почти) каждый Iterator
связан с Iterable
, который мы повторяем.
Каждый класс Iterable
может определить собственный класс Iterator
, который по запросу возвращает элемент next()
.
Как это зависит от того, какие данные доступны мгновенно:
- Он может получить каждый элемент из файла, из базы данных, из библиотеки или чего-то еще.
- Он может извлекать каждый элемент из объекта, который уже находится в памяти.
- и так далее
В случае 1, вероятно, не было бы полезно хранить все в памяти, но в случае 2, когда у нас уже есть все в памяти, мы действительно могли бы (и должны) запросить этот объект об элементе в следующая позиция.