Как реализованы итераторы в Java?

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


person user263245    schedule 01.02.2010    source источник
comment
Вы всегда можете посмотреть на источник и узнать :)   -  person skaffman    schedule 01.02.2010
comment
Что касается ссылки на источник, см. код класса JDK ArrayList:docjar .com/html/api/java/util/ArrayList.java.html, где Iterator реализован как внутренний класс   -  person sateesh    schedule 01.02.2010


Ответы (3)


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

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

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

person cletus    schedule 01.02.2010

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

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

person Thilo    schedule 01.02.2010

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

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

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

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

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

person glglgl    schedule 05.07.2016