游荡的概念是否存在于java的链表列表实现中? 在将节点的内容从链表中删除之前,是否需要通过将节点的内容设置为空来释放内存?或者不是那么好,因为无论如何都不会引用我的旧第一个节点?谢谢!
public Item pop() {
if (isEmpty())
throw new StackEmptyException("Stack Empty");
Item item = first.item;
first.item = null;
first = first.next;
return item;
}
答案 0 :(得分:0)
你的第二个陈述是正确的 - 你不需要清除节点,Java GC会处理它。
答案 1 :(得分:0)
它确实存在但你不太可能需要担心它。
在您的情况下,在first = first.next
之后,Java GC将识别first
指向的旧节点现在无法访问,因此可以收集。
答案 2 :(得分:0)
假设我们的节点看起来像这样
private class Node{
Item item;
Node next;
}
您不必将null分配给first.item。分配first = first.next;时,first.next是一个Node,这意味着它同时具有Item和下一个Node。
游荡是,当不再需要该对象时,保留对该对象的引用。在您的情况下,您可以续订引用,指向堆栈中的下一个项目。
但是,如果我们使用数组,我们的代码将是:
public Item pop() {
return arrayItems[--N];
}
在这里,我们从堆栈中返回一个Item,但是指针仍然指向我们指向堆栈的元素。为避免游荡,我们将已删除的项目条目设置为null:
public Item pop() {
Item item = arrayItems[--N];
arrayItems[N] = null;
return item;
}