将一个列表添加到另一个列表的末尾(不仅仅是复制引用)

5

我不能仅仅修改原始列表。

以下是我所见过的做法:

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从一个列表复制引用到另一个列表,则无论使用哪种方法都可以。 - LionC
它复制添加的项目的引用,而不是列表的引用。对于您展示的方法(使用new ArrayList<String>(l1)),这也是正确的。 - RealSkeptic
复制对于不可变类的引用不应该是一个问题。String是不可变的。 - fabian
Java的列表只保存引用。无论你是否复制堆中的对象,列表仍然只保存引用。 - Sharon Ben Asher
1个回答

6
addAll会将源列表的元素引用复制到目标列表的末尾,而不是将源列表本身的引用复制一份。
这与您使用的构造函数 - new ArrayList<String>(l1) - 没有区别。如果一个符合您的要求,那么另一个也同样符合。
顺便说一句,在不可变类(如String)的列表中,复制元素的引用(而不是元素的副本)并不重要,因为无法修改元素,因此您对第二个列表的内容所做的任何操作都不会影响原始列表的内容。

好的,我不知道那个。但是这是否意味着如果我修改一个列表,那么我会同时修改两个列表?我该如何避免这种情况?如果可能的话,我想要在之前创建的列表末尾得到一个列表的副本。 - keont
@keont 简单来说,Objects是被引用的,而不是List - Murat Karagöz
@keont 不,如果你从一个列表中添加或删除元素,另一个列表仍然保持不变。 - Eran
1
@keont 是的,addAll会将源列表的元素添加到目标列表的末尾。就像add为单个元素执行相同的操作一样。 - Eran
1
@keont 正确。两个列表都包含对相同元素的引用(最初在第一个列表中)。因此,更改其中一个元素的状态会在两个列表中都进行更改。但是,从一个列表中删除引用并不会从另一个列表中删除它(因为每个列表都是单独的对象)。 - Eran
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接