为什么不是LinkedList.Clear()O(1)

Ler*_*eri 26 java big-o

我假设LinkedList.Clear()在我正在处理的项目上是O(1),因为我使用LinkedList来消耗我的消费者中需要高吞吐量的BlockingQueue,之后清除并重新使用LinkedList.

事实证明这个假设是错误的,因为(OpenJDK)代码这样做:

    Entry<E> e = header.next;
    while (e != header) {
        Entry<E> next = e.next;
        e.next = e.previous = null;
        e.element = null;
        e = next;
    }
Run Code Online (Sandbox Code Playgroud)

这有点令人惊讶,有没有什么好的理由LinkedList.Clear不能简单地"忘记"它的header.next和header.previous成员?

Jon*_*eet 31

我在Eclipse中看到的版本(build 1.7.0-ea-b84)中的源代码上面有这样的注释:

// Clearing all of the links between nodes is "unnecessary", but:
// - helps a generational GC if the discarded nodes inhabit
//   more than one generation
// - is sure to free memory even if there is a reachable Iterator
Run Code Online (Sandbox Code Playgroud)

这使得他们为什么要这样做是相当清楚的,尽管我同意它将O(1)操作转换为O(n)有点令人担忧.

  • 我们希望所有节点都在RAM中的页面上,否则.... (2认同)