2

我用 LWJGL 制作了一个简单的“游戏”,让您可以控制一个三角形(这与我的 OpenGL 知识范围有关),当您按下空格键时,该三角形会射出较小的三角形。每个射弹在创建时都存储在一个 ArrayList 中:projectiles.add(new Projectile(x, y));. 我可以通过循环访问这些(代码如下所示),这是否意味着引用仍然存在?

for (int i = 0; i < projectiles.size(); i++) {
    projectiles.get(i).shoot();
}

谢谢

4

4 回答 4

5

是的,存在对您的射弹的可访问引用,因此射弹不受垃圾收集的影响。

当它们不再相关时,您将需要从 ArrayList 中删除它们,否则您将慢慢“泄漏”内存。

于 2012-06-04T01:12:02.290 回答
5

答案是“可能”。

ArrayList 引用了它所拥有的元素,但是......

如果您的代码引用了 ArrayList,则也引用了元素(通过 ArrayList 引用)。

如果您的代码未引用 ArrayList,则不会引用元素,并且ArrayList 及其所有元素都可能被垃圾回收。要取消引用 ArrayList 及其所有元素,只需执行list = null;

于 2012-06-04T01:19:39.783 回答
2

那么这是否意味着引用仍然存在?

是的,它确实。(Java 中的对象列表是对对象的引用列表。该语言在对象和它们的引用之间没有真正的区别......它们是不可分割的。)

第二个问题是列表本身存在多长时间,但简单的规则是,如果您的应用程序有某种方式访问​​对它的(硬)引用,那么一个对象(任何对象!)将继续存在于 Java 中。

在您的示例中,如果您的应用程序仍然可以执行该循环,则保证列表中的对象存在。时期。

请注意,将对列表的引用设置为 null 会导致循环失败;即它使我刚才所说的前提条件无效。此时,列表及其内容可能仍然存在,也可能不存在。但从执行循环代码的角度来看,这是没有意义的。

(唯一的问题是,如果应用程序保留了对它不打算使用的对象的引用,那么该对象很可能会继续存在。这是内存泄漏,它可能是一个问题......如果它发生太多了。)

于 2012-06-04T01:20:07.627 回答
0

是的,通常 ArrayList 仅包含引用而不是完整对象。当您尝试从 arraylist 中检索时,它会为您提供参考。这就是为什么您不需要实例化用于存储从 arraylist 检索的值的对象的原因。

于 2012-06-04T02:28:45.457 回答