是复制还是引用了ArrayList对象?

时间:2012-09-05 15:22:23

标签: java

所以我正在阅读this游戏教程,并且有一些代码可以让外星人/导弹的阵列列表在碰撞时消失。

  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(false)和a.setVisible(false)使特定的外星人/导弹不可见,但是'a'和'm'不是ArrayList对象拉出的ArrayList的一部分,虽然编码器没有将'a'或'm'对象插回到arraylist中的特定位置(或更新其在arraylist中的相应对象),但是代码似乎工作得很好

这让我想到,是'a'和'm'是通过地址引用到arraylist中的第i个对象而不是副本?

4 个答案:

答案 0 :(得分: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...
}

答案 1 :(得分:3)

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

答案 2 :(得分:1)

复制

引用,除非你调用clone()之类的东西,否则不会复制对象。

BTW:ArrayList包含引用。将对象的引用添加到ArrayList时,不会复制该对象,也不会将其复制到ArrayList中。

答案 3 :(得分:0)

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