Java垃圾收集器是否会回收包含对其他对象的引用的非引用对象

当我学习LinkedList数据结构时,会出现这个问题。 假设每个链接 (或节点)由一个对象表示,该对象包含两个字段, 数据一个链接的下一个点。 如果我想删除一个特定的节点,显然我将更新前一个Link的下一个字段。 但是我应该将删除的链接的下一个字段设置为null,以确保它将被垃圾收集器回收吗?

如果我的描述不清楚,我会尝试概括(或简化)我的问题。 假设类A的对象a1具有一个字段,该字段引用同一类的另一个对象a2 。 如果没有对象a1的引用,它是否有资格获得垃圾收集器? 或者我们必须将a1中的引用字段显式设置为null ? (不关心对象a2 ,除了a1中的引用字段之外还有其他引用)。

垃圾收集器理想地收集程序流无法访问的所有对象。 即使此对象引用了JVM中的所有内容。
如果程序的所有正在运行的线程都不包含对它的任何直接间接引用,则对象变得无法访问。
直接引用如下所示:

void main(String... args){ Object a = new Object(); // <- from here main thread of program // has reference to object `a` ... } 

间接引用如下所示:

 void main(String... args){ List b = new ArrayList(); b.add(new Object()); // <- here you can't access object by typing `a` // as in previous example, but you can get access with `b.get(0);` // so that object can be accessed indirectly -> it is reachable. } 

它还可以正确处理大型对象的情况,这些对象具有相互引用,但不再能从程序流中访问它们。

 MyClass a = new MyClass(); MyClass b = new MyClass(); a.field = b; b.field = a; // at this point a and b are reachable so they cannot be collected b = null; // at this point b's object is reachable indirectly through `a.field` // so neither a nor b can be collected a = null; // at this point you cannot reach neither a nor b // so a and b can be garbage collected, // despite the fact that a is referenced by b and vice versa 

UPD:添加了示例,更改了一些单词以使答案更清晰。

您的对象a1即使其字段仍引用其他对象也可以收集。 您不需要将其字段设置为null。

垃圾收集器收集无法访问的对象。 对象可以保存对其他人的引用,但仍然可以收集。 对象可以从其他不可到达的对象引用它,并且仍然可以被收集。

所有孤立对象都自动符合垃圾回收的条件。 而且你不需要将null的引用设置引用(但这是一个很好的编码实践)。

当垃圾收集器运行时,它将看到现在a1需要被垃圾收集,因为不再引用它。

它还将删除指向a2对象的a1中的引用字段

但仍然是a2 (正如你在a2 中提到的,除了a1中的引用字段之外还有其他引用 )因此它不符合垃圾收集条件,因此它仍然存在。