将ArrayList中的对象设置为null

时间:2013-09-15 01:00:01

标签: java loops arraylist null garbage-collection

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

例如:

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

}

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

2 个答案:

答案 0 :(得分:3)

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

在这个循环中:

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

n引用与ArrayList用于跟踪列表中对象的引用不同,因此将n设置为null会将对象的引用减少一个,但它会将引用从ArrayList保留为对象完好无损,因此,该对象不是垃圾收集的候选对象。您应该使用remove方法从ArrayList中删除对象。此时,如果其他地方没有对该对象的其他引用,它将成为删除的候选者。

答案 1 :(得分:0)

我认为你在变量和对象之间感到困惑。如果变量引用null,那么GC没有任何内容,因为变量不是GC'd,对象是。如果有一个有效的引用,ArrayList将不会是GC,如果它包含空值,那么它在内存或GC中都没有任何内容。

另一方面,如果ArrayList包含对象,然后你将一个或两个项置空,那么它不是确定对象的GC能力的ArrayList,因为它对它的引用已被切断,但是或不是其他对象引用它们。