java - 当 iterator.remove() 时将变量设置为 null

标签 java

我正在制作一款 2D 射击游戏,你可以在其中射击敌人,然后敌人就会爆炸。这是我的渲染方法:

public void renderEnemies(Graphics2D g) {
    for (Iterator<Enemy> it = enemies.iterator(); it.hasNext();) {
        Enemy enemy = it.next();
        enemy.render(g);
        if (enemy.die) { // die
            it.remove();
            playSound(4);
            corpses.add(new Corpse(1, enemy.x, enemy.y));
            currentEnemyLife = 0;
        }
        if (enemy.x < 0) { // out of screen
            if (!enemy.die) {
                hero.LIFE--;
            }
            it.remove();
            currentEnemyLife = 0;
        }
    }
}

好吧,我想做的就是,将被移除的敌人设置为 null,这样垃圾回收就可以将其从 JVM 中移除。我尝试在执行 it.remove(); 时添加 enemy = null; 。但它似乎只是删除了我使用 it.next(); 创建的变量 enemy ,而不是实际的敌人。 我用于添加敌人的方法是 enemies.add(new Enemy());

我使用Runtime.getRuntime().totalMemory()检查了内存,它不断增加直到最大值,然后游戏崩溃了。

最佳答案

it.remove 将从 enemies 集合中删除当前 Enemy 实例的引用。如果这是对该实例的唯一引用,则它将有资格进行垃圾回收。无需将本地 enemy 变量设置为 null,因为无论如何它都会在循环的下一次迭代中被覆盖。

您的内存问题可能出在其他地方。当您删除Enemy时,您通常会创建一个Corpse实例。您应该检查 corpses 集合的大小,看看它是否增长太多。

关于java - 当 iterator.remove() 时将变量设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32032234/

相关文章:

java - CoreNLP 服务器仅位于本地主机上

java - 如何在Android中添加向firebase添加数据的进度对话框?

java - 使用带有填充和 block 密码模式的哈希

java - 根据用户输入的数字循环初始化新对象

java - 为什么 eclipse Helios Web 项目在运行时找不到依赖的项目类?

java - 为什么在 Java 中需要按位 "and"进行某些字符到字节的转换?

java - 是否可以调试在 jni4net 中运行的 Java 程序?

java.lang.ClassNotFoundException : javafx. 应用程序.Application

java - Java 如何计算 ArrayList 中的匹配元素

java - RESTAssured 收到两个可能的状态代码之一