Java - 我们可以将链接节点中的 firstNode 设置为 null 以删除所有条目吗?

Java - Can we set firstNode to null in a linked node to remove all entries?

我有以下代码:

public final class LinkedBag<T> implements BagInterface<T> {
    private Node firstNode;
    private int numberOfEntries;

    public LinkedBag() {
        firstNode = null;
        numberOfEntries = 0;
    }

    // Other methods defined
    public int getCurrentSize() { }
    public boolean isEmpty() { }
    public boolean add(T newEntry) { }
    public T remove() { }
    public boolean remove(T anEntry) { }
    public int getFrequencyOf(T anEntry) { } 
    public boolean contains(T anEntry) { }
    public T[] toArray() { }

    public void clear() { 
        while(!isEmpty())
            remove();
    } 
}

要删除所有条目,上述版本的 clear() 方法会释放链中的每个节点,从而使其为空。

但是,要删除所有条目,clear() 方法的以下版本会释放链中的所有节点,从而使其为空吗?

    public void clear() { 
        firstNode = null;
    }

是的,会的。不像 C/C++ 我们负责释放之前分配的内存,Java 负责 收集 垃圾 当没有对象的强引用时。

当您将链表的头部 (firstNode) 设为 null 时,将不会(也不应该)对该节点有任何引用。因此,它有资格进行垃圾收集 (GC)。查看列表中的第二个节点,除了头部之外没有其他链接指向它,因此它也有资格被收集。

扩展这个,整个列表(列表中的所有节点)都可以被GC。

是;除了你还应该记住设置 numberOfEntries = 0; 之外。然后你的链表处于相同的状态,就好像一个新的空链表刚刚被创建(注意你的构造函数做同样的两件事),所以它正确地表示一个空列表。

关于垃圾收集器,这将在幕后自动解除分配已删除的节点对象,因为活动引用不再可以访问它们。为避免垃圾收集语言(如 Java)中的内存泄漏,主要问题是确保您不保留对不再需要的数据的引用。在这种情况下,在设置 firstNode = null; 之后,您的实例根本不保留任何引用,因此没有内存泄漏。

是的,将第一个节点设为空即可。 因为对所有后续节点的引用都将丢失,它们将由垃圾收集器自动释放。