Java,确保从arrayList中删除时删除对象

时间:2013-03-27 05:38:37

标签: java loops arraylist garbage

让我们说我正在删除一个名为“敌人”的“死”对象。

使用类似的东西:

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 ++代码,垃圾收集让我很困惑。

我可以通过垃圾收集器以任何方式查看对象是否被删除?

由于

5 个答案:

答案 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通常会稍微区别地管理内存,并且通常只在需要更多内存时进行垃圾收集。