在Java中删除/释放链表节点。请提出建议

在Java中删除/释放链表节点。请提出建议,java,algorithm,linked-list,Java,Algorithm,Linked List,全部,, 如果我要编写一个函数,从Java中的linkedList中删除给定headNode和作为输入参数的数据的节点。我将找到具有node.data=data的节点,并通过将其上一个节点指向其下一个节点来删除它*^。我的问题是,我们是否必须将要删除的节点指向null?释放记忆?或者GC将处理堆中不再访问的对象 *^:说A->B->C->D,如果B.data=data,那么做A->C。是否需要B->Null 请让我知道,如果它不清楚,我会编辑它。谢谢。如果您想删除节点B,只需要A指向C。垃圾收集

全部,, 如果我要编写一个函数,从Java中的linkedList中删除给定headNode和作为输入参数的数据的节点。我将找到具有node.data=data的节点,并通过将其上一个节点指向其下一个节点来删除它*^。我的问题是,我们是否必须将要删除的节点指向null?释放记忆?或者GC将处理堆中不再访问的对象

*^:说A->B->C->D,如果B.data=data,那么做A->C。是否需要B->Null


请让我知道,如果它不清楚,我会编辑它。谢谢。

如果您想删除节点B,只需要A指向C。垃圾收集器将处理您的B节点,因为不会留下任何引用

以下解释引自

如果从任何活动线程或任何静态引用都无法访问对象,那么对象就有资格进行垃圾收集或GC。换句话说,如果对象的所有引用都为null,则可以说对象有资格进行垃圾收集。循环依赖项不算作引用,因此如果对象A的引用是对象B,而对象B的引用是对象A,并且它们没有任何其他活动引用,那么对象A和对象B都有资格进行垃圾收集

通常,在以下情况下,对象可以在Java中进行垃圾收集:

1该对象的所有引用都显式设置为null,例如object=null

2对象在块内创建,一旦控件退出该块,引用将超出范围

3父对象设置为null,如果一个对象持有另一个对象的引用,并且当您将容器对象的引用设置为null时,子对象或包含的对象将自动符合垃圾收集的条件

4如果一个对象通过WeakHashMap只有活动引用,它将有资格进行垃圾收集


如果您想删除节点B,您只需要A指向C。垃圾收集器将处理您的B节点,因为不会留下任何对它的引用

以下解释引自

如果从任何活动线程或任何静态引用都无法访问对象,那么对象就有资格进行垃圾收集或GC。换句话说,如果对象的所有引用都为null,则可以说对象有资格进行垃圾收集。循环依赖项不算作引用,因此如果对象A的引用是对象B,而对象B的引用是对象A,并且它们没有任何其他活动引用,那么对象A和对象B都有资格进行垃圾收集

通常,在以下情况下,对象可以在Java中进行垃圾收集:

1该对象的所有引用都显式设置为null,例如object=null

2对象在块内创建,一旦控件退出该块,引用将超出范围

3父对象设置为null,如果一个对象持有另一个对象的引用,并且当您将容器对象的引用设置为null时,子对象或包含的对象将自动符合垃圾收集的条件

4如果一个对象通过WeakHashMap只有活动引用,它将有资格进行垃圾收集


不,您不必将B设置为null。Java垃圾收集器将为任何无法访问的对象释放内存

不,您不必将B设置为null。Java垃圾收集器将为任何无法访问的对象释放内存

正如大家所说,您不需要将其设置为null。我只想补充一点,我之前有一个类似的问题,可能并不明显。如果您有一个双链接列表,其中每个节点引用上一个和下一个节点,例如a-B-C-D,然后删除C-D,这样您就剩下a-B了。您也不需要担心C或D,即使它们仍然从另一个节点引用它们。显然,GC足够聪明,可以处理这种情况,因为每个人都说不需要将其设置为null。我只想补充一点,我之前有一个类似的问题,可能并不明显。如果您有一个双链接列表,其中每个节点引用上一个和下一个节点,例如a-B-C-D,然后删除C-D,这样您就剩下a-B了。您也不需要担心C或D,即使它们仍然从另一个节点引用它们。很明显,总检察官也很聪明,可以处理这个案子