在 Java 中清除受保护的双向链表

Clear Guarded Doubly Linked List in Java

我目前正在为 CS 考试学习,我想到了以下问题:如果我有一个包含两个字段(一个 head-guard 和 tail-guard)的双向链表并且我想清除该列表(使其为空)。将尾节点设置为我头部之后的 next 元素是否足够,反之亦然(尾的 previous 节点是头部)。垃圾回收会不会删除这两者之间的元素(元素之间相互引用,但是外部对这个'block'节点的引用不存在?

为了更清楚一点:如果我有这个:
|HEAD| <--> |node_01| <--> | . . .| <--> |node_n| <--> |TAIL|

然后我把头尾的next/previous节点改成这样:
|HEAD| <--> |Tail|

将 Java 删除 node_01 - node_n(注意单箭头):
|HEAD| <-- |node_01| <--> | . . . | <--> |node_n| --> |TAIL|

它们都相互引用,但 外部 不存在引用 - 因此我无法联系到它们。或者这是内存泄漏?

在您的特定示例中,GC 完全清除列表。 这是因为从图到应用程序对象图的根对象无法访问它们。

clear() 的实现中,您可以观察到每个对象也都设置为 null,这是为了防止在某些对象引用它时发生任何内存泄漏。但在你的情况下,你明确表示这不可能发生。

实现clear供参考:

/**
 * 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++;
}