让我们说我正在删除一个名为“敌人”的“死”对象。
使用类似的东西:
for(int i = 0; i < enemies.size(); i++)
{
Enemy en = (Enemy) enemies.get(i);
if(en.getVisible() == true)
en.update();
else
enemies.remove(i);
}
从ArrayList中删除对象后是否会被删除?还是“应该”呢?我以前主要做C ++代码,垃圾收集让我很困惑。
我可以通过垃圾收集器以任何方式查看对象是否被删除?
由于
答案 0 :(得分:1)
我真的很喜欢用C / C ++和Java看到整个垃圾收集惨败的反面。 Java有它自己的垃圾收集器,你不需要担心内存管理 - .remove()就足够了。
答案 1 :(得分:1)
如果您从ArrayList中删除一个对象,并且该对象没有任何其他引用,那么它将符合条件#&为垃圾收集器。之后,您不必担心将其从堆中删除:JVM会通过自动垃圾收集器来实现。
答案 2 :(得分:0)
我认为这取决于你输入对象的方式。如果你把它保存在其他地方它应该仍然存在,但是如果你直接将它添加到arrayList它可能是垃圾。
P.S。您的代码需要更正
enemies.remove(i);
enemies.remove(i--);
答案 3 :(得分:0)
回复我对ConcurrentModificationException
的评论。你不会得到它,但你的循环仍然不正确。看看:
List<String> list = new ArrayList<String>(Arrays.asList("A","B","C","D"));
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if ("B".equals(s) || "C".equals(s)) list.remove(i);
}
System.out.println(list);
输出:
[A, C, D]
由于C
始终在增加和跳过元素,因此不会删除 i
。
答案 4 :(得分:0)
在大多数情况下,您不必担心Java中的显式内存管理 - 只要在从列表中删除后没有其他对象引用它们,垃圾收集器将(最终)删除它们。
如果enemies
列表中的对象持有某些系统资源或需要明确处理的其他内容(例如文件句柄或其他内容),您将需要在丢失之前清除它参考:
Enemy enemy = enemies.remove();
enemy.dispose(); // this is your method to clean up the internals - name it what you want
// continue your loop here
在与示例代码相关的注释中,您将需要使用Iterator
而不仅仅是迭代索引的for循环,这样您就可以remove
正确地解决当前问题索引和列表大小。您可能还想考虑不同的List
实施(例如LinkedList
,因为从ArrayList
中间插入/移除如果它很大就会变得昂贵。
对于您的其他问题:
我可以通过垃圾收集器以任何方式查看对象是否被删除?
当你这样做时,你可以override the finalize
method你的班级be careful。另请注意,当您的对象被垃圾收集时会有no guarantees - 不同的JVM通常会稍微区别地管理内存,并且通常只在需要更多内存时进行垃圾收集。