假设我有三个列表 free
, home
和 tableau
,它们都包含不同的对象。我还有一个名为 History
的类(class)它的构造函数采用所有这三个列表并创建一个新对象。现在,我正在尝试制作 List<History>
包含所有历史对象。我正在添加所有 <History>
对象如下,
List<Hisotry> history = new ArrayList<>();
history.add(new History(free, home, tableau));
//make some changes in the lists (free, home, tableau),
//then add it again in the history list
history.add(new History(free, home, tableau));
//make some more changes again then add it
history.add(new History(free, home, tableau));
虽然它是将所有对象添加到列表中,但它们都引用同一个对象。换句话说,如果我添加 3 <History>
对象,它打印相同的 <Hisotry>
对象 3 次,当它们都应该不同时。我不确定为什么每次创建新对象并将其添加到列表时它都会添加或引用同一个对象。添加新对象时我做错了什么?
**附言我希望我说得有道理,如果没有,请随时告诉我,我会上传我的整个代码。
最佳答案
Answer by Shesterov是正确的。
这是一个图表,显示您在问题中描述的内容。我添加了“动物”对象作为包含在“免费”-“主页”-“画面”列表中的元素,因为您没有提及它们的内容。
正确答案说明了两点:
- 所有三个“History”对象都指向同一个名为“free”、“home”和“tableau”的 3 个列表。如果您将一个项目添加到“home”列表或从“tableau”列表中删除一个项目,所有三个“History”对象都会看到更改。如果您希望每个 History 对象都有自己的私有(private)“Animal”对象集合,请在 History 的构造函数中复制列表。复制列表的一种方法是实例化一个新列表并将旧列表提供给它的构造函数。
- 如果您在任何 Animal 对象中改变(更改成员字段),则此层次结构中任何位置的任何其他对象都将看到更改,前提是它持有对该特定 Animal 对象的引用(指针)。因此,将名为“John”的猫更改为“Pierre”,“home”和“tableau”列表(但不是“free”列表)以及所有三个 History 对象都会受到影响约翰现在被称为皮埃尔。
如果您遵循 Shesterov 的代码 并在每个 History 对象的构建过程中复制每个列表,您最终会得到 12 个粉红色列表而不是 3:原始 3 加 3 个列表对于 3 个历史对象中的每一个。所以:12 = 3 + ( 3 * 3 )
。但是您仍然拥有相同的 5 个 Animal 对象。但是走这条路线历史“b”,例如,可以改变它的“家”列表以删除对名为 Bob 的鸟的引用,而原始“家”列表和历史“a”“家”列表和历史“c” ““home”列表仍然每个都有一个指向名为 Bob 的鸟的指针引用。
换句话说,不要将传递对象引用视为通过 Xerox 机器。相反,将这些对象想象成纸质索引卡,每个对象都通过一根绳子连接起来,如图所示,透明胶带将绳子连接到卡片上。传递一个物体并不会复印卡片;传递一个对象用胶带附加另一个字符串。
最后一点:不要将 List/Collection 对象与其“包含”(指向)的元素混淆。在仓库中,您可以通过在剪贴板上列出每个 crate 的 ID 号来清点 crate 。剪贴板是一个“列表”,但它本身并不是 crate 。剪贴板/ list 对象是一个集合,指的是 以完全分离不同的其他对象, crate 。
关于java - 在 JAVA 中将列表对象添加到另一个列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39938096/