添加新元素时,一个 ArrayList 的所有元素都会改变吗? [复制]
Posted
技术标签:
【中文标题】添加新元素时,一个 ArrayList 的所有元素都会改变吗? [复制]【英文标题】:All elements of An ArrayList change when a new one is added? [duplicate] 【发布时间】:2011-08-02 07:17:11 【问题描述】:首先,很抱歉无法提供任何源代码。我的项目非常大,连接所有内容是不切实际的,而且我无法缩小这个非常烦人的问题。我会尽力在这里解释。
我在代码中的每个循环上动态创建一个类的新实例。这个实例在循环中被动态地赋予了几个属性,例如'name'。在每个循环结束时,新生成的实例被添加到另一个第三类中保存的 ArrayList 中。
然而问题是,当添加一个新元素时,无论出于何种原因,所有先前的元素都会更改以完全匹配最新的元素。我的猜测是 ArrayList 正在创建对动态创建的元素的引用,因此每当它发生变化时,它们都会发生变化,但我不知道如何解决这个问题。
对于本解释的质量,我将不胜感激并再次道歉。我将发布您可能希望看到的任何特定代码
根据要求 - XmlHandler.java - http://pastebin.com/mGmWt1RD ParsedDataSet.java = http://pastebin.com/k1xb3KBe 内容.java = http://pastebin.com/UxiL2f9q
只是为了减少您的理解时间 - 该项目是一个 epub 阅读器。 XMLHandler 正在从另一个未显示的类中的 SAX 解析器中调用。 XMLHandler 用于 3 个不同的 XML 集的 3 次不同的时间,所以那里有些混乱。
问题在于'toc' ArrayList。 'toc' 或 TableOfContents 包含稍后要引用的 Contents 实例(未显示)。我正在尝试将数据传递给“内容”的每个新实例,然后将其传递到静态 ArrayList
【问题讨论】:
【参考方案1】:我已经看到人们多次报告此类问题,并且总是归结为:您实际上不是创建一个新实例,而是在每次迭代中使用相同的实例的循环。这是一个容易犯的错误,特别是如果您来自具有不同复制语义的语言。有很多不同的方法可以让你犯这个错误;如果您编辑问题以显示循环代码,我相信我能够解释发生了什么。
好的,现在您已经添加了代码:问题是在“内容”中,所有数据成员都被标记为“静态”。在 Java 中,这意味着所有对象共享一个变量——即,该变量对每个对象都具有相同的值。所以实际上您正在创建许多 Content 对象以放入 ArrayList,但它们看起来都一样!从 Content 的数据成员中移除那些“静态”属性,一切就绪。
【讨论】:
是的,向我们展示循环和对象创建代码。 好的,问题是在“内容”中,所有数据成员都被标记为“静态”。在 Java 中,这意味着所有对象共享一个变量——即,该变量对每个对象都具有相同的值。所以实际上您正在创建许多 Content 对象以放入 ArrayList,但它们看起来都一样!从内容的数据成员中删除那些“静态”属性,一切就绪! 抱歉没有早点回复你,只好睡觉了。谢谢! 很抱歉再次打扰您,但现在所有“内容”属性都变为空白,我不知道为什么 看XmlHandler
,我认为从第33行开始的逻辑是可疑的。我认为每当您点击“navPoint”元素,或包含在 navPoint 中的任何元素,您都会创建一个新的Content
。这实际上会导致创建大量 Content
对象,设置一个参数,然后将其丢弃。当且仅当qName
等于“navPoint”时,才会在第 38 行调用构造函数;如果inNavPoint
已经为真,那么它绝对不会发生,因为这会将之前的“实时”Content
对象扔掉。【参考方案2】:
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);
【讨论】:
工作良好...非常感谢以上是关于添加新元素时,一个 ArrayList 的所有元素都会改变吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章