2

如果我有一个对象的 ArrayList,并且我将其中一些设置为 null,它们是否容易受到 gc 的影响?或者他们会留下来,因为它们仍然被 ArrayList 引用

前任:

for(NPC n : NPCs){
    n.act();
    n.draw(frame);
    if(n == outOfMap){
            n = null;
        }

}

如果该循环“总是”被迭代,是否会收集 outOfMap 对象?或者干脆呆在那里会有一个空值?

4

2 回答 2

3

您需要区分对象和对它们的引用。对于同一个对象,可以有多个引用指向它。当引用数达到 0 时,该对象是垃圾收集器要删除的候选对象。

在这个循环中:

for(NFC n : NFCs)
{
   n = null;
}

n引用不同于 ArrayList 用于跟踪列表中对象的引用,因此将 n 设置为 null 会将对该对象的引用减少一,但它会使 ArrayList 对对象的引用保持不变,因此,对象不是垃圾回收的候选对象。您应该使用该remove方法从 ArrayList 中删除对象。此时,如果在其他地方不存在对该对象的其他引用,它将成为删除的候选对象。

于 2013-09-15T01:06:36.617 回答
0

我认为您在变量和对象之间感到困惑。如果变量引用 null,则 GC 没有任何意义,因为变量不是 GC'd,对象是。如果 ArrayList 存在对它的有效引用,并且如果它包含空值,则 ArrayList 不会被 GC 处理,那么它就没有任何东西可以保存在内存或 GC 中。

另一方面,如果 ArrayList 包含对象,然后您将一两个项目设为空,那么决定对象的 GC 能力的不是 ArrayList,因为它对它的引用已被切断,而是其他是否对象引用它们。

于 2013-09-15T01:01:23.257 回答