【问题标题】:Add list at the end of another list (not just copy references)在另一个列表的末尾添加列表(不仅仅是复制参考)
【发布时间】:2015-08-09 06:42:40
【问题描述】:

我不能只修改原始列表。

这是我看到的:

List<String> l1 = new ArrayList<String>();
l1.add("Hello");
l1.add("World");
List<String> l2 = new ArrayList<String>(l1); //A new arrayList.
l2.add("Everybody");

所以我现在会有一个新列表,它是第一个列表的副本。我可以修改第二个而不改变第一个。

现在我无法理解如何做同样的事情,而是将项目添加到列表的末尾。

虽然我正在执行上述代码,并将列表添加到另一个列表。以addAll 为例。但是我到处都能看到这只是如何复制引用等等,所以如果它在一个方法中或其一个 rmi 代码中,则列表本身将不完整,它将获得对我刚刚创建的另一个列表的引用。

由于我需要为许多类型的列表执行此操作,因此不确定逐项进行是否理想。因此,如果可能的话,我需要在另一个列表的末尾添加一个列表。

【问题讨论】:

  • 您想将哪些项目添加到列表的哪一端?对象列表始终只包含引用,因此您只能将引用从一个列表复制到另一个列表,如果您使用构造函数或 adall 则无关紧要
  • 它复制添加的项目的引用,而不是列表的引用。您展示的方法也是如此(使用new ArrayList&lt;String&gt;(l1))。
  • 复制对不可变类的引用应该不是问题。 Strings 是不可变的。
  • Java 列表仅包含引用。复制堆中的对象没关系,列表仍然只保存引用

标签: java list arraylist


【解决方案1】:

addAll 将源列表元素的引用复制到目标列表的末尾,它不会复制对源列表本身的引用。

这与您使用的构造函数 - new ArrayList&lt;String&gt;(l1) - 所做的没有什么不同。如果一个符合您的要求,另一个也符合。

顺便说一句,对于不可变类的 List,例如 String,复制对元素的引用(而不是复制元素)并不重要,因为您不能修改元素,因此您对第二个列表的内容所做的任何操作都不会影响原始列表的内容。

【讨论】:

  • 好吧,不知道。但这确实意味着如果我修改一个列表,我会同时修改两个列表,对吗?我该如何避免呢?如果可能的话,我想要一份列表副本,放在之前创建的列表的末尾
  • @keont 简单地说。引用了 Objects,而不是 List
  • @keont 不,如果您从一个列表中添加或删除元素,另一个保持不变。
  • @keont 是的,addAll 将源列表的元素添加到目标列表的末尾。就像 add 对单个元素一样。
  • @keont 正确。两个列表都包含对相同元素的引用(最初在第一个列表中)。因此,更改这些元素之一的状态会在两个列表中更改它。但是,从一个列表中删除引用并不会从另一个列表中删除它(因为每个列表都是一个单独的对象)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多