我在算法类(class)中浏览了Queue 的实现代码,并观察了作者使用的dequeue() 代码:
private Node first, last;
private class Node {
String item;
Node next;
}
public boolean isEmpty() {
return first == null;
}
// Code segment in doubt
public String dequeue() {
String item = first.item;
first = first.next;
if (isEmpty()) last = null;
return item;
}
这里,first 和last 可以理解,分别指向队列中的第一个和最后一个元素。我对作者使用的 dequeue() 中的代码有点怀疑。因为,他只是在做:
first = first.next;
没有将 first.next 分配给 null。它会不会留下一个悬垂的引用(或游荡),这会阻碍 JVM 的垃圾收集机制?我有点困惑,dequeue() 的代码不应该是这样的吗? (我确定在 C/C++ 中代码应该如下所示,但想知道在这种情况下 JAVA 的预期行为)
public String dequeue() {
Node old;
old = first;
first = first.next;
old.next = null;
if (isEmpty()) last = null;
return old.item;
}
如果有人能给我指点一个资源,其中详细介绍了这个主题并提供了很好的例子,我将不胜感激。
最佳答案
设置 old.next = null
是不必要的,因为 old
已准备好被垃圾收集(first = first.next
赋值消除它的最后一个 Activity 引用(一旦 dequeue
退出),因此垃圾收集器将不会跟踪它的任何引用。
关于Queue dequeue()示例代码中的Java垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16653158/