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