我有一个单一链接列表
a->b->c->d->e
a,b,c,d和e是node类型的对象。我想在遍历列表时删除一个节点,然后将删除的节点作为列表的头部,如下面的代码所示
list.delete(iterator, current);
list.addObjectAtFront(current);
public void delete(ListIterator li, Node node) {
if (li == null) {
throw new NullPointerException();
}
li.next();
if (li.previous() != null) {
li.previous().setNext(node.getNext());
}
}
public void addObjectAtFront(Object o) {
Node newNode = new Node(null, o);
if (this.head != null) {
newNode.setNext(this.head);
this.head = newNode;
} else {
this.head = this.tail = newNode;
}
}
当调用上述方法时,说当前项为c。我期待以下
list.delete(iterator, current);
Output: a->b->d->e
list.addObjectAtFront(current);
Output: c->a->b->d->e
我有两个相互矛盾的想法
删除后,c不指向任何其他节点,可以在调用第二个方法之前进行垃圾回收。
c不能被垃圾收集,因为它本身不是空的并且有一些数据。这意味着如果我不需要使用c;它只会在记忆中徘徊。
哪一个是正确的还是我完全弄错了,需要对对象引用有新的理解?
答案 0 :(得分:3)
垃圾收集永远不会删除您有任何引用方式的内存(除非您使用WeakReference)
也就是说,如果您仍然使用该节点,请确保java不会垃圾收集它。作为程序员,您不需要考虑垃圾收集器的行为方式,除非是为了提高性能。 GC不应该影响代码的正确性。
哪一个是正确的,或者我完全弄错了,需要一个 对对象引用的新理解?
直接回答,两者都没有。删除时,使用对名为current
的节点的引用。该引用是作为c的SAME引用。当c被删除时,你仍然有引用它的当前值。然后将当前添加到列表的前面。现在你再次有2个引用,然后当它从作用域中删除时会丢失当前引用,使你回到1引用。
c永远不会收集垃圾。
答案 1 :(得分:2)
仅仅因为一个对象中包含数据并不意味着它不会被垃圾收集。垃圾收集检查您是否持有对它的任何引用。如果您对c
的唯一引用位于链接列表中并将其删除,那么它将被垃圾收集。
答案 2 :(得分:1)
c不会被垃圾收集,因为'current'正在引用它。
当没有对象的实时引用时,可以对一个对象进行垃圾回收,但是记住一个对象可以有多个引用。