【问题标题】:Loitering in Java's Linked List Stack implementation在 Java 的 Linked List Stack 实现中徘徊
【发布时间】:2015-07-30 22:20:12
【问题描述】:
java的链表栈实现中是否存在游荡的概念?
在从链表中删除节点之前,是否需要通过将节点的内容设置为 null 来释放内存?还是因为无论如何都不会引用我的旧第一个节点,所以这样做并没有那么好?谢谢!
public Item pop() {
if (isEmpty())
throw new StackEmptyException("Stack Empty");
Item item = first.item;
first.item = null;
first = first.next;
return item;
}
【问题讨论】:
标签:
java
memory
linked-list
stack
【解决方案1】:
它确实存在,但您不太可能需要担心它。
在您的情况下,在first = first.next 之后,Java GC 将识别出first 指向的旧节点现在无法访问,因此可以被收集。
【解决方案2】:
您的第二个陈述是正确的 - 您不需要清除节点,Java GC 会处理它。
【解决方案3】:
假设我们的节点看起来像这样
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;
}