【问题标题】:To delete an entire linked list in java which I have created删除我创建的java中的整个链表
【发布时间】:2021-03-22 05:00:10
【问题描述】:

我想删除我在 java 中创建的整个列表(注意:我没有在 java.util 中使用内部列表)。我已将 head 分配给 null 但我的问题是 java 垃圾收集器会处理没有 head 的列表还是应该删除将由 java 垃圾收集器处理的每个节点(我的意思是将每个节点设置为 null)?以下是我的代码,请让我知道哪一个可以,尽管两者都可以,但我仍然想知道。提前致谢。

//first code
public void deleteList()
{
    Node n = head;
    Node n1;
    head = null;
    System.out.println("Deleting list");
    while(n != null)
    {
        n1 = n;
        n = n.next;
        n1 = null;
    }
    n1 = n;
    n1 = null;
    System.out.println("List deleted");
}
//second code
public void deleteList()
{
    head = null;
}

【问题讨论】:

  • 两者都可以,但如果第一个使垃圾收集器的工作更容易,则可能会带来性能优势;例如LinkedList.clearJDK implementation 确实设置了对null 的所有引用,并带有注释:“清除节点之间的所有链接是“不必要的”,但是: - 如果丢弃的则有助于分代GC节点多于一代——即使存在可访问的迭代器,也一定会释放内存”.
  • 也就是说,请注意,您的第一个版本实际上并未将任何引用设置为 null - 它将局部变量 n1 设置为 null,这并不相同完全没有。
  • 我不明白这是一个问题。第二个版本可以正常工作,尽可能简单,并且专门利用了您可用的语言功能(垃圾收集)。你为什么还要考虑做其他事情?
  • @KarlKnechtel 出于性能原因,您可能会考虑明确执行此操作;请参阅我对 JDK 实现的评论。

标签: java singly-linked-list


【解决方案1】:

这取决于您的实施。如果您的 Node 类仅是内部的(因此您永远不会返回可能保存它的 Node)并且您没有任何静态数据,那么应该没有从垃圾收集根到任何节点的路径,并且 GC 将摆脱他们。

所以这可能是正确的,除非您的实现正在做一些不寻常的事情。 (我还假设您没有尾变量或其他任何引用内部节点的变量,因为这些变量也需要设置为 null)。

【讨论】:

  • 是的,我没有任何尾部变量,谢谢
【解决方案2】:

仅当特定对象没有任何链接到其他节点的内部依赖项时,垃圾收集器才会销毁该对象。换句话说,只要对象不再被引用,它们就会被销毁并回收它们的内存

  1. 您的第一个代码是正确的,例如,当您与其他节点(即tail 节点)存在内部依赖关系时。
  2. 当您与其他节点没有任何依赖关系时,您的第二个是正确的。

【讨论】:

  • 谢谢,我没有任何尾部变量,所以我想第二个就足够了
  • 如果您有任何其他引用节点的本地字段,您也可以将这些设置为空。您不应该对 List 之外的节点对象有任何引用,因为这严重违反了封装性 - 它首先违背了编写类的目的。
  • 如果你只有head,或者headtail,这两种方法都可以。您可以通过设置 head = null; tail = null; 来执行 #2,它的工作原理相同。
  • @KarlKnechtel : 违反封装在这里是断章取义的!
  • 如果你问的是应该以哪种方式编写代码,那么这样的原则不能脱离上下文。
猜你喜欢
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 2021-06-07
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多