我正在学习CS考试,我想到了以下问题:如果我有一个带有两个领域的双重链表(一个头卫和尾卫)并且我想清除列表(让它为空) .是否足以将尾节点设置为我头后的下一个元素,反之亦然(尾部的前一个节点是头部).垃圾收集是否会删除这两个元素之间的元素(这些元素相互引用,但是没有从外部引用到该“块”的节点存在?
为了使这一点更清楚:如果我有这个:
| HEAD | < – > | node_01 | < – > | . . .| < – > | NODE_N | < – > |尾|
我将head和tail的下一个/上一个节点更改为:
| HEAD | < – > |尾|
Java会删除thenode_01 – node_n(注意单个箭头):
| HEAD | < – | node_01 | < – > | . . . | < – > | NODE_N | – > |尾| 他们都互相引用,但没有来自外部的参考 – 因此我无法联系到他们.或者这是内存泄漏?
最佳答案 在您的特定示例中,GC将完全清除列表.
这是因为它们无法从图形到应用程序对象图的根对象.
在clear()
的实现中,您可以观察到每个对象也被设置为null,这是为了防止在某个对象引用它时发生任何内存泄漏.但在你的情况下,你明确表示不会发生这种情况.
执行清晰参考:
/**
* Removes all of the elements from this list.
*/
public void clear() {
Entry<E> e = header.next;
while (e != header) {
Entry<E> next = e.next;
e.next = e.previous = null;
e.element = null;
e = next;
}
header.next = header.previous = header;
size = 0;
modCount++;
}