首先,道歉是因为无法提供任何源代码。我的项目非常大,并且将一切都联系起来是不切实际的,而且我无法缩小这个非常烦人的问题。我会尽力在这里解释一下。
我在代码中的每个循环上动态创建一个类的新实例。这个实例在循环中动态地给出了几个属性,例如'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
答案 0 :(得分:18)
我见过人们多次报告这种问题,而且总是归结为:你实际上不创建一个新实例,而是每次迭代都使用相同的实例循环。这是一个容易犯的错误,特别是如果你来自一种具有不同复制语义的语言。你可以通过多种不同的方式犯这个错误;如果您编辑问题以显示循环代码,我相信我能够解释发生了什么。
好了,既然您已经添加了代码:问题是在“内容”中,所有数据成员都标记为“静态”。在Java中,这意味着所有对象共享一个变量 - 即,变量对于每个对象具有相同的值。事实上你正在创建许多要放在ArrayList中的Content对象,但它们看起来都一样!从Content的数据成员中删除那些“静态”属性,您将全部设置。
答案 1 :(得分:10)
ArrayList
只存储元素的引用。确保您的代码如下:
ArrayList list = new ArrayList<>();
loop(...) {
MyObject newOne = new MyObject();
newOne.setXXX(xxx);
list.add(newOne);
}
错误的代码:
ArrayList list = new ArrayList<>();
MyObject sameOne = new MyObject();
loop(...) {
sameOne.setXXX(xxx);
list.add(sameOne);
}