【问题标题】:linked list deletion in javajava中的链表删除
【发布时间】:2015-09-21 05:20:30
【问题描述】:

如何在java中完全删除链表。一些教程建议我应该逐个节点删除它。但是,如果我简单地将 head 设置为 null,那会是错误的吗?因为所有元素都有资格进行垃圾回收。

【问题讨论】:

  • 似乎是正确的...如果您将其设置为 null,GC 将删除它...或者当您离开上下文时
  • lList.clear() 有什么问题???
  • 删除值,而不是列表本身
  • 你想达到什么目的?我从未在 Java 中“删除”变量,坦率地说,我认为这没有任何意义。只需限制变量的范围,您不必关心这一点。

标签: java linked-list


【解决方案1】:

你不能。您只能通过删除对它的所有引用来推荐该列表作为垃圾回收的候选者。

如果您拥有唯一的引用,那么将该引用设置为 null 将安排对象进行垃圾回收。您可以建议使用System.gc() 进行垃圾收集,但这不是特别好的风格,而且并非所有 JVM 都支持它。

逐个节点删除元素(使用clear()可以有点帮助,因为它会减少每个列表项上的引用数量。这将减少列表消耗的内存量。

【讨论】:

    【解决方案2】:

    您可以将LinkedList 引用变量指向null

    任何引用null 的引用变量都自动符合垃圾回收的条件

    List list = new LinkedList();
    list.add("hi");
    list = null; // now eligible for *Garbage Collection*, leave it for JVM to handle
    

    此外,如果您执行list.clear(),它将清除此list 中的所有元素,但不会清除list 本身。

    我们也可以调用System.gc(),但是System.gc()并不能保证垃圾收集器一定会运行,它只能要求JVM运行GC,但是完全依赖于JVM,所以我们应该把它交给JVM仅用于处理 GC。

    有关更多信息,请参阅此 Oracle 文档here

    【讨论】:

    • 引用 null 的引用不指向任何东西,因此不能被垃圾收集...但是 new LinkedList 可以,因为 没有更多引用它
    • @BinkanSalaryman 告诉你这一点。这是错误的。在此处查看 Oracle 链接 docs.oracle.com/cd/E19159-01/819-3681/abebi/index.html
    • 我实际上是在谈论 参考变量,例如上面示例中的 list 是一个参考变量,它最初是指 LinkedList,最后是 null跨度>
    【解决方案3】:

    是的,您可以简单地将head 分配为null,但为了安全起见(就像某些节点是从其他地方引用的一样),最好将所有节点设置为null

    如果您查看java.util.LinkedList 中的代码,则 clear() 方法的作用相同。

    /**
     * Removes all of the elements from this list.
     * The list will be empty after this call returns.
     */
    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++;
    }
    

    first 在您的情况下是 head

    您也可以参考这个comprehensive answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多