Подтвердить что ты не робот

Clear() impl в Java LinkedList

Я боюсь, что это действительно глупый вопрос, но здесь говорится:

Почему метод clear в реализации по умолчанию LinkedList по умолчанию пытается перемещаться по списку и отцеплять все узлы? Почему бы просто не отцепить заголовок и оставить остальную часть списка связанными - GC получит его в любом случае, нет?

Здесь метод:

/**
 * Removes all of the elements from this list.
 */
public void clear() {
    Entry<E> e = header.next;
    while (e != header) {
        Entry<E> next = e.next;
        e.next = e.previous = null;
        e.element = null;
        e = next;
    }
    header.next = header.previous = header;
    size = 0;
modCount++;
}

Зачем ходить? Почему бы просто не перейти к header.next = header.previous = header;?

Лучшее, что я могу понять, это помогает GC...? Эта ссылка http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#997442 показывает, что.

ТИА...

4b9b3361

Ответ 1

Их метод гарантирует, что даже если в другом коде все еще содержатся ссылки на определенные узлы, остальные узлы будут GC'ed.

В противном случае даже одна внешняя ссылка на один из узлов предотвратит сбор всей цепочки.

Кроме того, другие операции в списке могут выполняться одновременно (например, просмотры через subList() или Collections.unmodifiableList(), итераторы), и это гарантирует, что эти вещи сразу воспринимают список как "пустой".

Ответ 2

IIRC, это было внесено в JDK6, чтобы помочь в выполнении определенных (генераторных) алгоритмов GC. Часто сам List и более старые узлы находятся в старшем поколении, чем некоторые другие узлы. Молодые поколения будут собираться чаще, в результате чего молодые узлы будут скопированы до того, как будет обнаружено, что все узлы являются мусором.

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

Ответ 3

Я просто размышлял над этой самой проблемой в своем блоге разработки игр. Спасибо за ответ. Я бы утверждал, что экспозиция node была сомнительной проектной скидкой. Также отрывочно, что альтернативные представления в списке (итераторы и т.д.) Полагаются на node, чтобы не работать быстро. Вместо того, чтобы полагаться на это поведение побочных эффектов, под-представления в списке должны проверять количество изменений. В любом случае, я понимаю, почему они застряли с ним сейчас.

Ответ 4

Исходный код java.util.LinkedList на http://developer.classpath.org/doc/java/util/LinkedList-source.html предполагает, что вы можете просто установить первый и последние элементы равны нулю.

Конечно, если вы склонны быть более защитными, вы можете пройти через все это. Я лично считаю, что это может быть очень дорогостоящей задачей, если ваш список содержит несколько тысяч элементов.