删除我在java中创建的整个链表
我想删除我在java中创建的整个列表(注意:我没有在java.util中使用内部列表)。我已经将head分配给null,但我的问题是java垃圾收集器是否会处理没有head的列表,还是应该删除java垃圾收集器将处理的每个节点(我的意思是将每个节点设置为null)?以下是我的代码,请让我知道哪一个是好的,虽然两个工程,但我仍然想知道。提前谢谢删除我在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
//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;
}