如果我要有一个对象的ArrayList,并且我将它们中的一些设置为null,它们是否容易受到gc的影响?或者它们会保留,因为它们仍然被ArrayList引用
例如:
for(NPC n : NPCs){
n.act();
n.draw(frame);
if(n == outOfMap){
n = null;
}
}
如果循环“总是”迭代,是否会收集outOfMap对象?或者只是留在那里会有一个空值?
答案 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,因为它对它的引用已被切断,但是或不是其他对象引用它们。