当创建我自己的单链表类时,我注意到推送和弹出功能似乎按预期工作。尽管在 pop_back()
方法中我设置了 headTmp = null
以指示不再需要此操作。另外,由于 tmp 已分配给 headTmp.data,因此这可能会搞砸对 tmp 的分配吗?此分配是 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;
}
最佳答案
您不需要将其设置为null
。一旦引用被破坏(没有更多实例引用该对象),垃圾收集器就会自动清理它。
尽管将某些内容设置为 null
并不是一件坏事(基本上省略了前一个链接),但这并不能保证该对象将被清理。如果某个其他实例仍在引用该指针,则垃圾收集器将不会清除它,直到引用原始对象的所有实例都忽略了它们的关系。
长话短说,没有必要,但不会造成伤害。
作为 http://javarevisited.blogspot.nl/2011/04/garbage-collection-in-java.html 的简短引用:
- 作为 Java 程序员,你不能在 Java 中强制进行垃圾回收;仅当 JVM 认为需要基于 Java 堆大小的垃圾回收时才会触发。
如果将 null
分配给某个对象,则将忽略它的链接。这是在作用域结束时自动完成的。由于垃圾收集器仅在 Java 需要内存时运行,因此它几乎没有用处。
还有一个简短的旁注(如果您习惯使用 C++):
Java 将所有对象和数组作为指针处理。如果您想复制它们,则必须深度复制它们。
关于java - Java 中是否有类似于 C++ 的删除函数,以便将项目设置为 null 提示 GC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18114592/