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

Posted

技术标签:

【中文标题】在 Java 中清除受保护的双向链表【英文标题】:Clear Guarded Doubly Linked List in Java 【发布时间】:2016-05-08 21:11:00 【问题描述】:

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

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

我把头尾的next/previous节点改成这样:|HEAD| <--> |Tail| Java 会删除node_01 - node_n(注意单个箭头):|HEAD| <-- |node_01| <--> | . . . | <--> |node_n| --> |TAIL|

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

【问题讨论】:

如果真的没有对这些悬空节点的引用,那么我希望垃圾收集器会在下一次计划收集时删除它们。 【参考方案1】:

在您的特定示例中,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++;

【讨论】:

非常感谢!我只是在想,这是一个非常优雅的清除列表的解决方案,即使这样做可能是一种更安全的方式。 感谢您提供指向JCF 实现的链接!

以上是关于在 Java 中清除受保护的双向链表的主要内容,如果未能解决你的问题,请参考以下文章

大话数据结构Java程序——双向链表的实现

双向链表--Java实现

Java 自定义双向链表

线性链表的双向链表——java实现

03-java实现双向链表

Java数据结构—— 双向链表及带傀儡节点双向链表的实现