Как итераторы реализованы в Java? - PullRequest
4 голосов
/ 01 февраля 2010

Сохраняет ли экземпляр Итератора, открытый в коллекции, всю коллекцию в памяти и получает доступ к позиции, которая увеличивается каждый раз, когда вызывается next ()? Или я что-то упустил?

Ответы [ 3 ]

10 голосов
/ 01 февраля 2010

Реализация Iterator зависит от конкретного Collection, который он повторяет. Если вы посмотрите на исходный код JDK, например, ArrayList и LinkedList используют разные итераторы.

Помните, Iterator - это интерфейс , а не конкретный класс, поэтому он просто указывает контракт, а не реализацию.

Вообще говоря, итераторы будут (в зависимости от реализации) хранить ссылку на коллекцию и какой-то индекс, чтобы отмечать, где они находятся.

4 голосов
/ 01 февраля 2010

Полностью зависит от реализации, но в целом (для итераторов, созданных для коллекций в памяти), итератор будет иметь ссылку на базовую коллекцию, поэтому да, он будет хранить ее в памяти.

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

0 голосов
/ 05 июля 2016

Это полностью зависит от объекта, связанного с Iterator. Помните, что (почти) каждый Iterator связан с Iterable, который мы повторяем.

Каждый класс Iterable может определять собственный класс Iterator, который по запросу возвращает элемент next().

Как это делает так, что данные доступны мгновенно:

  • Он может извлекать каждый элемент из файла, из базы данных, из библиотеки или чего-либо еще.
  • Может извлекать каждый элемент из объекта, который уже находится в памяти.
  • и т. Д.

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

...