用Java清除保护的双向链表

我正在学习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++;
}
点赞