java - 仅通过使 head = null 删除单个链表?

标签 java data-structures linked-list garbage-collection

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

3 = head > 1 > 2 > 4 > null

通过设置 head = null,JVM 会处理它。由于头节点没有被任何变量引用,它应该被垃圾收集。

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

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

最佳答案

这是 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++;
}

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

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

另请注意,您可能永远不会调用 clear(),而只是停止引用 LinkedList 类型的对象,而将所有节点链接在一起。如果无法通过 GC 根的引用链访问所有节点,则 GC 将收集所有节点。这就是您使用列表时 99% 的情况。

关于java - 仅通过使 head = null 删除单个链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31069894/

相关文章:

java - 为什么Erlang中没有中间件?

java - 处理不同类型的列表 - 使用 scala(或函数式编程)比 Java 更昂贵吗?

java - 如何返回数组中出现次数最多的字谜列表?

java - 如何(动态地)改变 Java 流的过滤条件?

c++ - 链表头双指针传递

algorithm - 范围内的 squarefree 数字计数

algorithm - 将二维网格图数据结构转换为树

C - 将结构指针与整数指针传递给函数

java - 迭代器接口(interface)

c++ - 如何删除添加到 C++ 链表中的最后一个元素