Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除我在java中创建的整个链表_Java_Singly Linked List - Fatal编程技术网

删除我在java中创建的整个链表

删除我在java中创建的整个链表,java,singly-linked-list,Java,Singly Linked List,我想删除我在java中创建的整个列表(注意:我没有在java.util中使用内部列表)。我已经将head分配给null,但我的问题是java垃圾收集器是否会处理没有head的列表,还是应该删除java垃圾收集器将处理的每个节点(我的意思是将每个节点设置为null)?以下是我的代码,请让我知道哪一个是好的,虽然两个工程,但我仍然想知道。提前谢谢 //first code public void deleteList() { Node n = head; Node n1; h

我想删除我在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");
}

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


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

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

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

  • 两者都可以工作,但是如果第一种方法使垃圾收集器的工作更容易,那么可能会有性能上的好处;例如,
    LinkedList.clear
    确实将所有引用设置为
    null
    ,注释为:“清除节点之间的所有链接是“不必要的”,但是:-如果丢弃的节点驻留在多个代中,则有助于代GC-即使存在可访问的迭代器,也一定会释放内存”。也就是说,请注意,您的第一个版本实际上没有将任何引用设置为null-它将局部变量
    n1
    设置为null,这一点都不相同。我不明白这是一个什么问题。第二个版本工作正常,尽可能简单,并且特别利用了您可用的语言特性(垃圾收集)。你为什么还要考虑做其他事情呢?请参阅我对JDK实现的评论。是的,我没有任何尾部变量thanksthanks,我没有任何尾部变量,因此我想第二个变量就足够了。如果您有任何其他引用节点的本地字段,您也可以将它们设置为null。您不应该在列表之外有任何对节点对象的引用,因为这是对封装的严重违反-它首先破坏了编写类的目的。如果您只有
    head
    ,或者既有
    head
    又有
    tail
    ,这两种方法都会起作用。只需设置
    head=null,就可以执行#2;tail=null和它的工作原理是一样的。@KarlKnechtel:违反封装在这里是断章取义的!如果您要问一个关于应该以何种方式编写代码的问题,那么像这样的原则不能脱离上下文。
    
    //second code
    public void deleteList()
    {
        head = null;
    }