2

在创建我自己的单链表类时,我注意到 push 和 pop 函数似乎按预期工作。虽然在pop_back()我设置的方法headTmp = null中表明这不再需要。此外,这可能会破坏对 tmp 的分配,因为它已分配给 headTmp.data 吗?此分配是对 headTmp.data 的副本还是引用分配?我不确定 Java 是否会在函数的参数之外进行复制。

在 C++ 中,分配将是一个副本,然后我将有一个指针并删除 headTmp 项。我是否需要headTmp = null在此代码中进行处理,或者这对数据的分配没有任何帮助或可能会损害数据的分配,并且只是设置了prev.next = null足够的内容,GC 是否会处理此清理工作?我是否应该考虑类似于 C++ 中使用引用计数的共享指针的垃圾收集,这样当没有任何东西指向该对象时,它会被清除?我习惯清理自己的垃圾

package dynamiclist;

public class LinkedList<T>
{
    public T pop_back()
    {
        Node<T> prev = null;
        Node<T> headTmp = head;

        while ( headTmp.next != null)
        {
            prev = headTmp;
            headTmp  = headTmp.next;
        }

        T tmp = headTmp.data;
        headTmp = null;  // does this help in GC at all? Does it effect previous assignment of tmp?

        prev.next = null;
        return tmp;
    }

    public void push_back(T t)
    {
        if (head == null)
        {
            head = new Node<T>(t);
            return;
        }

        Node<T> headTmp = head;
        while (headTmp.next != null)
        {
            headTmp= headTmp.next;
        }

        headTmp.next = new Node<T>(t);
        headTmp.next.next=null;
    }

    public void printList()
    {
        Node<T> headTmp = head;
        while ( headTmp!=null)
        {
            headTmp.printNode();
            headTmp = headTmp.next;
        }
        System.out.println();
    }

    private Node<T> head;
}
4

3 回答 3

3

您无需将其设置为null. 一旦引用被破坏(不再有实例引用对象),垃圾收集器就会自动清理它。

尽管将某些内容设置为(基本上省略了前一个链接)并不是一件坏事null,但这并不能保证该对象将被清除。如果某个其他实例仍在引用该指针,那么垃圾收集器将不会清理它,直到所有引用原始对象的实例都省略了它们的关系。

长话短说,这不是必需的,但不会受到伤害。

作为对http://javarevisited.blogspot.nl/2011/04/garbage-collection-in-java.html的简短参考:

  1. 作为 Java 程序员,你不能在 Java 中强制垃圾回收;只有当 JVM 认为它需要基于 Java 堆大小的垃圾收集时,它才会触发。

如果您分配null给一个对象,您将忽略它的链接。这是在作用域结束时自动完成的。由于垃圾收集器仅在 Java 需要内存时运行,因此几乎没有用处。

顺便说一下(如果您习惯于 C++):

Java 将所有对象和数组作为指针处理。如果要复制它们,则必须对它们进行深度复制。

于 2013-08-07T22:06:18.973 回答
2

当 GC 确定不再存在对某个对象的引用时(弱引用不影响这一点,请参阅WeakReference),该对象被标记为删除,并且可以随时发生删除。

假设不存在其他引用,将字段设置为 null 会将该对象标记为可丢弃,这意味着它是稍后删除的候选对象。您不必将该字段设置为 null,尽管它通常适合您的应用程序逻辑(GC 除外)即使您没有将字段设置为 null,当对封闭对象的最后一个引用消失时,对其字段所引用的对象的引用也会消失(当然,除非它们在其他地方被引用)。

您可能希望查看以下两篇文章:

于 2013-08-07T22:07:29.583 回答