Будет ли List собирать мусор, если существует только итератор - PullRequest
1 голос
/ 10 января 2020

У меня есть метод, который создает и возвращает меня. Список пользователей:

private List<User> createUsers() {
    List<User> users = new ArrayList<>();
    //fill list
    return users;
}

После того, как я получу этот список, единственное, что я делаю, - это получение итератора и его повторение. Так что я думаю о возвращении только итератора, а не целого списка:

private Iterator<User> getUsersIterator() {
    List<User> users = new ArrayList<>();
    //fill list
    return users.iterator();
}

Но я не уверен, что этот список все еще жив. Существующий итератор избегает сбора мусора?

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Предотвращает ли существование итератор сборку мусора из коллекции?

Да. Итератор должен включать ссылку на коллекцию. Это необходимо для любой нормальной реализации методов next() и hasNext() 1 .

Так что, если итератор доступен, то и коллекция тоже.

Это также может сработать против вас. Например, нежелательная ссылка на итератор, сохраненный в переменной stati c, может вызвать утечку памяти, затрагивающую всю коллекцию.


1 - Гипотетически, реализация итератора могла бы использовать программный или слабая ссылка, но следствием может быть то, что итерация «ломается» из-за того, что сборщик мусора собирается.

2 голосов
/ 10 января 2020

Да,

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

Например, в случае ArrayList он реализован как внутренний класс, который хранит ссылку на свой класс.

...