【问题标题】:After ArrayList.add() in a loop, all elements are identical. Why? [duplicate]在循环中的 ArrayList.add() 之后,所有元素都是相同的。为什么? [复制]
【发布时间】:2012-10-29 19:03:26
【问题描述】:

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

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

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

我找到的解决方法是:

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

这与 Java 中的传递引用有关吗?为什么在第一种情况下元素是相同的?谢谢。

【问题讨论】:

  • 显示getDataForObject() 的代码。或者您的完整活动代码
  • 这个问题是在另一个问题之前提出的。这是一个副本而不是那个副本?

标签: java android arraylist


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    globalPublicStaticArrayList<Object>.add(localObject);
    

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

    【讨论】:

      【解决方案3】:

      Java 使用按值调用,但这里这些值是对象的引用

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

      【讨论】:

      • 感谢您的洞察力。如果您指的是 getDataForObject(),它只是问题中的一个占位符。我可以在调试器/日志中看到 localObject 为每次迭代保存不同的数据。唯一的区别在于 add() 调用。这是 java.util.ArrayList.add();
      • @iceman: I can see in the debugger/log that localObject holds different data for each iteration. 这什么也没告诉你。它可以包含不同的数据,但仍然是同一个对象。类比:你的房子每天可以包含不同的家具,但它仍然是同一所房子。更换家具并不会使它成为不同的房子。
      • 好的。我明白了。我现在的问题是,在每次传递之后,或者更确切地说,在每次 add() 调用之后,globalPublicStaticArrayList 中的所有元素都变得相同?是这样的: Pass 1: localObject = 1 globalPublicStaticArrayList = [1];传递 2:localObject = 2 globalPublicStaticArrayList = [2, 2];通过 3:localObject = 3 globalPublicStaticArrayList = [3, 3, 3];第 4 关:localObject = someValue globalPublicStaticArrayList = [ someValue, someValue, someValue, someValue];传递N次:localObject = finalValue globalPublicStaticArrayList = [ finalValue * N次];
      • @iceman:您的列表中有很多对同一个对象的引用。要创建新对象,请使用 new 运算符。像这样:localObject = new ....;.
      • 知道了。而不是 ArrayList,我得到 ArrayList。感谢您的努力:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多