我用LWJGL制作了一个简单的'游戏',让你可以控制一个三角形(这与我的OpenGL知识的程度有关),当你按空格键时它会拍出较小的三角形。每个射弹在创建时存储在ArrayList中:projectiles.add(new Projectile(x, y));
。我可以通过循环访问这些(下面显示的代码),这是否意味着引用仍然存在?
for (int i = 0; i < projectiles.size(); i++) {
projectiles.get(i).shoot();
}
由于
答案 0 :(得分:5)
是的,存在对您的射弹的可达参考,因此射弹不会被垃圾收集。
当ArrayList不再相关时,您需要从ArrayList中删除它们,否则您将慢慢“泄漏”内存。
答案 1 :(得分:5)
答案是“可能”。
ArrayList引用了它所拥有的元素,但是......
如果您的代码具有对ArrayList的引用,那么也会引用元素(通过ArrayList引用)。
如果您的代码未引用ArrayList,则不引用元素,并且ArrayList及其所有元素都可能被垃圾回收。要取消引用ArrayList及其所有元素,只需执行list = null;
答案 2 :(得分:2)
这是否意味着引用仍然存在?
是的。 (Java中的对象列表是对象的引用列表。该语言没有对对象及其引用进行真正的区分......它们是不可分割的。)
存在列表本身存在多长时间的次要问题,但简单的规则是,如果您的应用程序有某种方式访问(硬)引用,那么对象(任何对象!)将继续存在于Java中
在您的示例中,如果您的应用程序仍然可以执行该循环,则保证列表中的对象存在。期。
请注意,将列表引用设置为null会导致循环失败;即它使我刚才陈述的先决条件无效。此时,列表及其内容可能仍然存在,或者它们可能不存在。但是从执行循环代码的角度来看,这是没有意义的。
(唯一的障碍是如果一个应用程序保持对它不会使用的对象的引用,那么该对象可能会继续存在。这是一个内存泄漏,它可以是一个问题 ...如果发生太多。)
答案 3 :(得分:0)
是的,通常ArrayList只保存引用而不是完整对象。 Whenevr你试图从arraylist中恢复,它为你提供了参考。这就是为什么你不需要实例化用于存储从arraylist中重新获取的值的对象。