只需将head = null删除单个链表即可?

Dee*_*ohn 1 java garbage-collection linked-list data-structures

为什么我不能head=null删除完整的链接列表?

3 = head > 1 > 2 > 4 > null
Run Code Online (Sandbox Code Playgroud)

通过制作head = null,JVM将负责它.由于头节点没有被任何变量引用,它应该被垃圾收集.

这个解决方案有什么问题?

注意:我知道删除完整链接列表的正确解决方案,但我很好奇为什么我不能head=null删除完整的链表?

JB *_*zet 6

这是java.util.LinkedList.clear()的代码,逐字:

public void clear() {
    // 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
    for (Node<E> x = first; x != null; ) {
        Node<E> next = x.next;
        x.item = null;
        x.next = null;
        x.prev = null;
        x = next;
    }
    first = last = null;
    size = 0;
    modCount++;
}
Run Code Online (Sandbox Code Playgroud)

评论回答了你的问题.这是不必要的.但它可以帮助GC,如果有一个Iterator引用其中一个节点,它可以使更多的对象更快地符合GC:引用的节点仍然不符合GC的条件,但引用之前和之后的所有节点节点将是,因为它们不再被引用.

请注意,开发人员选择使clear()方法更慢(O(n)而不是O(1)),以使GC更快并减少"内存泄漏".你可以做反向选择.

另请注意,您可能永远不会调用clear(),只是停止引用LinkedList类型的对象,将所有节点链接在一起.如果没有任何节点可通过GC根目录的参考链到达,GC将收集所有节点.这就是你使用列表时99%的情况.