添加新的元素时,ArrayList的所有元素都会发生变化吗?

Mar*_*k D 8 java arrays android loops reference

首先,道歉是因为无法提供任何源代码.我的项目非常大,将一切都联系起来是不切实际的,而且我无法缩小这个非常烦人的问题.我会尽力在这里解释一下.

我在代码中的每个循环上动态创建类的新实例.这个实例在循环中动态地给出了几个属性,例如'name'.在每个循环结束时,新生成的实例将添加到另一个第3类中保存的ArrayList中.

然而问题是,当添加新元素时,无论出于何种原因,所有先前元素都会更改以完全匹配最新元素.我的猜测是ArrayList正在创建对动态创建元素的引用,这样每当它发生变化时,它们都会发生变化,但我不知道如何解决这个问题.

对于这个解释的质量,我将再次感谢任何建议和道歉.我将发布您可能希望看到的任何特定代码段

如要求 - XmlHandler.java - http://pastebin.com/mGmWt1RD ParsedDataSet.java = http://pastebin.com/k1xb3KBe Content.java = http://pastebin.com/UxiL2f9q

只是为了减少你的理解时间 - 该项目是一个epub读者.XMLHandler是从另一个未显示的类中的SAX解析器调用的.对于3种不同的XML集,XMLHandler使用了3次不同的时间,因此存在一些混乱.

问题在于'toc'ArrayList.'toc'或TableOfContents保存稍后要引用的Contents实例(未显示).我试图传递数据'Content'的每个新实例,然后将其传递给静态ArrayList

Ern*_*ill 19

我已经看到人们多次报告这种问题了,它总是归结为:你实际上并没有创建一个新实例,而是在循环的每次迭代中使用相同的实例.这是一个容易犯的错误,特别是如果你来自一种具有不同复制语义的语言.你可以通过多种不同的方式犯这个错误; 如果您编辑问题以显示循环代码,我相信我能够解释发生了什么.

好的,既然您已经添加了代码:问题是在"内容"中,所有数据成员都标记为"静态".在Java中,这意味着所有对象共享一个变量 - 即,变量对于每个对象具有相同的值.事实上,您正在创建许多要放入ArrayList的Content对象,但它们看起来都一样!从Content的数据成员中删除那些"静态"属性,您将全部设置完毕.


卢声远*_* Lu 12

ArrayList只存储元素的引用.确保您的代码如下所示:

ArrayList list = new ArrayList<>();
loop(...) {
    MyObject newOne = new MyObject();
    newOne.setXXX(xxx);
    list.add(newOne);
}
Run Code Online (Sandbox Code Playgroud)

错误的代码:

ArrayList list = new ArrayList<>();
MyObject sameOne = new MyObject();
loop(...) {
    sameOne.setXXX(xxx);
    list.add(sameOne);
}
Run Code Online (Sandbox Code Playgroud)