2009-02-22 2 views
11

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

Почему ясный метод реализации LinkedList по умолчанию в Java потрудился список и отцепить все узлы? Почему бы просто не отцепить заголовок и оставить остальную часть связанного списка - 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 своего рода предлагает это.

ТИА ...

ответ

18

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

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

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

+0

Я был настроен на несогласие, заявив, что для внешнего кода не существует ссылки на ссылку LinkedList $ Entry ..., но косвенно через LinkedList $ ListItr вы можете ... Спасибо и поймайте! – overthink

+0

Что будет с узлом? Iterator или subList, но они не будут действительны, поэтому не будут сохраняться. –

+0

@Tom: если вы этого не сделали, сублистер и итератор будут продолжать работать, но структура коллекции пытается быть неудачной (но не гарантирует). –

2

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

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

0

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

0

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

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

Смежные вопросы