2012-09-05 40 views
0

因此,我正在阅读this游戏教程,并且有代码使阵列列表与外星人/导弹在碰撞时消失。是否复制或引用ArrayList对象?

ArrayList ms = craft.getMissiles(); 

    for (int i = 0; i < ms.size(); i++) { 
     Missile m = (Missile) ms.get(i); 

     Rectangle r1 = m.getBounds(); 

     for (int j = 0; j<aliens.size(); j++) { 
      Alien a = (Alien) aliens.get(j); 
      Rectangle r2 = a.getBounds(); 

      if (r1.intersects(r2)) { 
       m.setVisible(false); 
       a.setVisible(false); 
      } 
     } 
    } 

在最后一个循环,m.setVisible(假)和a.setVisible(假)作出具体外星人/导弹看不见但“a”和“M”不是他们的ArrayList ArrayList中的一部分对象被拉出并铸造成“a”和“m”,但由于编码器不会将“a”或“m”对象插入到其在数组列表中的特定位置(或更新其对应的对象在列表中)。

哪个让我想到,'a'和'm'是由地址引用到arraylist中的第i个对象而不是作为副本?

+1

(相关答案已经提交,所以......)有一件事 - 你不应该真的在使用for()'循环的那个版本 - 查找'for-each'循环。你似乎没有使用列表的索引,除了得到一个特定的元素... –

+0

谢谢,我同意。但是这只是我正在学习一个教程,我想我自己的实现我会记下这个! :) – user772401

回答

4

是的。他们是参考。任何时候你说

A a = new A(); 

在Java中,a是一个参考,实际的对象(混乱的常见原因)。

当您使用标准集合时,从该集合中获取元素将返回对包含对象的引用。因此,遍历集合并对包含的对象执行更改是微不足道的。

for(int i = 0; i < list.size(); i++) { 
    list.get(i).clear(); // changes the object in the list... 
} 
+0

你是什么意思是“迭代通过一个集合和执行包含对象的变化”是微不足道的?如果我有一个字符串数组列表,并且我想通过遍历它们来为其中的所有字符串添加字符串“.com”,那么这将如何微不足道?试图理解你的陈述..谢谢 – user772401

+0

@ user772401字符串是一种特殊情况,不是微不足道的,因为它们是不可变的。所以没有增函数方法来调用字符串。 –

+1

@ user772401 - 看到我修改的答案 –

3

Java中的对象总是通过引用复制,除非您克隆它们。因此,除非您正在使用基元,否则当您使用赋值运算符或从函数返回它时,它将被引用复制。

0

ArrayList.get()为您提供对该对象的引用,而不是副本。

1

引用被复制,除非您调用类似clone()的对象,否则不会复制对象。

BTW:ArrayList包含引用。当您将对象的引用添加到ArrayList时,对象不会被复制,并且不会像ArrayList那样复制。