全部, 如果我要编写一个函数来从Java中的linkedList删除一个节点(给定headNode和数据作为输入参数)。我会找到具有“node.data = data”的节点,并通过将其前一个节点指向其下一个节点* ^来删除它。我的问题是,我们是否必须将“待删除”节点指向null?释放记忆?或者GC将处理不再在堆中访问的对象。
* ^:假设A-> B-> C-> D,如果B.data =数据,则使A-> C。是B-> Null必要吗?
如果不清楚请告诉我,我会编辑它。感谢。
答案 0 :(得分:6)
如果你想删除Node B,你只需要A指向C.垃圾收集器会处理你的B节点,因为它不会有任何引用。
以下解释引自http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html
如果某个对象无法从任何活动线程或任何静态引用访问,则该对象符合垃圾收集或GC的条件,换句话说,如果一个对象的所有引用都为空,则可以说该对象符合垃圾回收条件。循环依赖项不计入引用,因此如果对象A具有对象B的引用而对象B具有对象A的引用,并且它们没有任何其他实时引用,则对象A和B都将有资格进行垃圾收集。
通常,在以下情况下,对象有资格在Java中进行垃圾收集:
1)该对象的所有引用都明确设置为null,例如object = null
2)在块内创建对象,并且一旦控制退出阻塞,引用就会超出范围。
3)父对象设置为null,如果对象保存另一个对象的引用,并且当您将容器对象的引用设置为null时,子对象或包含对象将自动符合垃圾回收的条件。
4)如果一个对象只有WeakHashMap的实时引用,它将有资格进行垃圾回收。
答案 1 :(得分:0)
不,您不必将B设置为null
。 Java垃圾收集器将为任何无法访问的对象释放内存。
答案 2 :(得分:0)
正如大家所说,你不需要将它设置为null。我只是想补充一点,我之前有一个类似的问题可能并不明显。如果你有一个双向链表,每个节点引用前一个节点和下一个节点,例如A-B-C-D,你就删除了C-D,这样你就可以使用A-B了。您也不需要担心C或D,即使它们都有引用它们(来自另一个)。显然,GC也很聪明,可以照顾这个案例