游荡在Java的链表栈的实现

问题描述 投票:0回答:3

请问游荡的概念存在于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
3个回答
0
投票

你的第二个说法是正确的 - 你并不需要清除节点时,Java GC将照顾它。


0
投票

它确实存在,但它是不可能的,你需要担心。

在你的情况,first = first.next后的Java GC将认识到,旧节点指向由first现在可达等都可以回收。


0
投票

比方说,我们的节点看起来是这样的

private class Node{
Item item;
Node next;
}

您不必指定为null,first.item。当分配第一= first.next ;,所述first.next是节点,这意味着它有两个项和下一个节点。

游荡是,保持对一个对象的参照时,不再需要它。在你的情况更新参考,指向在堆栈中的下一个项目。

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

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

在这里,我们从栈中返回一个项目,但指针保持,指着我们把堆栈的元素。为了避免游荡,我们集合中删除项条目为空:

public Item pop() {
Item item = arrayItems[--N];
arrayItems[N] = null;
return item;
    }
© www.soinside.com 2019 - 2024. All rights reserved.