在循环中的ArrayList.add()之后,所有元素都是相同的。为什么?

时间:2012-11-09 12:52:57

标签: java android arraylist

如果我这样做[准java代码]:

while (loop)
{
    localObject = getDataForObject();
    globalPublicStaticArrayList<Object>.add(localObject);
}

globalPublicStaticArrayList中的所有元素都相同,等于添加的localObject的最后一个副本。我通过调试器中的循环步进,看到只要添加了一个Object,它就会被复制到globalPublicStaticArrayList的所有元素中。

我找到的解决方法是:

while (loop)
{
    localObject = getDataForObject();
    globalPublicStaticArrayList<Object>.add(new Object(localObject.member1, localObject.member2,...));
}

它与Java中的pass-by-reference有关吗?为什么元素在第一种情况下是相同的?感谢。

3 个答案:

答案 0 :(得分:4)

Java使用按值调用,但这些值是引用到对象。

您要添加到列表中的内容不是对象的副本,而是参考的副本。每次调用它时,您的方法都返回相同的对象。它可能每次都应该返回一个新对象,然后你就不需要这种解决方法了。

答案 1 :(得分:2)

globalPublicStaticArrayList<Object>.add(localObject);

这里传递localObject引用。您需要每个对象的副本,您应该在每次迭代时创建一个新对象

答案 2 :(得分:0)

在getDataForObject()中,您可能没有创建返回类型的“新”对象。 因为所有对象都指向相同的地址。