【问题标题】:Loitering in Java's Linked List Stack implementation在 Java 的 Linked List Stack 实现中徘徊
【发布时间】:2015-07-30 22:20:12
【问题描述】:

java的链表栈实现中是否存在游荡的概念? 在从链表中删除节点之前,是否需要通过将节点的内容设置为 null 来释放内存?还是因为无论如何都不会引用我的旧第一个节点,所以这样做并没有那么好?谢谢!

public Item pop() {
    if (isEmpty()) 
        throw new StackEmptyException("Stack Empty");
    Item item = first.item;
    first.item = null;
    first = first.next;
    return item;
}

【问题讨论】:

    标签: java memory linked-list stack


    【解决方案1】:

    它确实存在,但您不太可能需要担心它。

    在您的情况下,在first = first.next 之后,Java GC 将识别出first 指向的旧节点现在无法访问,因此可以被收集。

    【讨论】:

      【解决方案2】:

      您的第二个陈述是正确的 - 您不需要清除节点,Java GC 会处理它。

      【讨论】:

        【解决方案3】:

        假设我们的节点看起来像这样

        private class Node{
        Item item;
        Node next;
        }
        

        您不必将 null 分配给 first.item。赋值first = first.next;时,first.next是一个Node,即同时拥有Item和下一个Node。

        闲逛是在不再需要时持有对对象的引用。在您的情况下,您更新引用,指向堆栈中的下一个项目。

        但是,如果我们使用数组,我们的代码将是:

        public Item pop() {
        return arrayItems[--N];
        }
        

        这里,我们从栈中返回一个 Item,但指针仍然存在,指向我们从栈中取出的元素。为避免闲逛,我们将已移除的项目条目设置为 null:

        public Item pop() {
        Item item = arrayItems[--N];
        arrayItems[N] = null;
        return item;
            }
        

        【讨论】:

          猜你喜欢
          • 2021-10-19
          • 2019-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          • 2011-12-02
          相关资源
          最近更新 更多