Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否复制或引用了ArrayList对象?_Java - Fatal编程技术网

Java 是否复制或引用了ArrayList对象?

Java 是否复制或引用了ArrayList对象?,java,Java,所以我正在阅读游戏教程,里面有一些代码可以让带有外星人/导弹的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.si

所以我正在阅读游戏教程,里面有一些代码可以让带有外星人/导弹的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.setVisiblefalse和a.setVisiblefalse使特定的外星/导弹不可见,但“a”和“m”不是ArrayList的一部分,它们是ArrayList对象,被拉出并浇铸到“a”和“m”中,但代码似乎工作正常,因为编码器没有将“a”或“m”对象插入ArrayList中的特定位置或更新其属性arraylist中对应的对象


这让我想,“a”和“m”是否由地址引用到arraylist中的第i个对象而不是副本?

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

是。他们是推荐人。你说什么时候都行

A a = new A();
在Java中,a是一个引用,而不是实际的对象,这是一个常见的混淆源

使用标准集合时,从该集合获取元素将返回对所包含对象的引用。因此,遍历集合并对包含的对象执行更改是很简单的

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

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

引用被复制,除非您调用类似克隆的东西,否则对象不会被复制


顺便说一句:ArrayList包含引用。将对象的引用添加到ArrayList时,对象不会被复制,也不会在ArrayList中被复制。

相关答案已提交,因此。。。有一件事-您不应该真正使用for循环的那个版本-查找“for each”循环。除了获取特定元素之外,您似乎没有使用列表的索引…谢谢,我同意。但我只是在遵循一个教程,我想对于我自己的实现,我会注意到这一点!:迭代集合并在包含的对象中执行更改是什么意思?如果我有一个字符串数组列表,并且我想通过迭代将string.com添加到所有字符串中,那么这怎么会很简单呢?试图理解你的陈述。。thanks@user772401字符串是一种特殊情况,而不是简单的,因为它们是不可变的。所以没有可以调用字符串的mutator方法。@user772401-请参阅我的修订答案