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

Java 在另一个列表的末尾添加列表(不仅仅是复制引用),java,list,arraylist,Java,List,Arraylist,我不能只修改原始列表 我就是这么看的: 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"); List l1=new ArrayList(); l1.加上(“你好”); l1.添加

我不能只修改原始列表

我就是这么看的:

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");
List l1=new ArrayList();
l1.加上(“你好”);
l1.添加(“世界”);
列表l2=新阵列列表(l1)//一个新的数组列表。
l2.添加(“所有人”);
所以我现在会有一个新的列表,它是第一个列表的副本。我可以修改第二个,而不必修改第一个

现在我很难理解如何做同样的事情,只是在列表的末尾添加了项目

我想做的正是上面的代码,并将列表添加到另一个列表中。例如,使用
addAll
。但是我到处都能看到它是如何只复制引用的,等等,所以如果它在一个方法或它的rmi代码中,那么这个列表本身就不完整,它会得到我刚刚创建的另一个列表的引用


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

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

这与您正在使用的构造函数——
newarraylist(l1)
——的功能没有什么不同。如果一个满足你的要求,另一个也满足


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

您希望将哪些项目添加到列表的哪一端?对象列表始终只包含引用,因此如果使用构造函数或adall,则只能将引用从一个列表复制到另一个列表,而不必复制添加项的引用,而不复制列表的引用。对于您所展示的方法(使用
新ArrayList(l1)
)也是如此。复制对不可变类的引用应该不会有问题<代码>字符串是不可变的。Java列表只保存引用。如果复制堆中的对象也没关系,列表仍然只会保存referenceAllright,我不知道。但这意味着如果我修改一个列表,我就同时修改两个列表,对吗?我如何避免这种情况?如果需要的话,我想要一份列表的副本,在先前创建的列表的末尾possible@keont简单地说。引用的是
对象,而不是
列表
@keont否,如果从一个列表中添加或删除元素,则另一个列表保持不变。@keont Yes,addAll将源列表的元素添加到目标列表的末尾。就像add对单个元素做的一样。@keont Correct。两个列表都包含对相同元素(最初在第一个列表中)的引用。因此,更改其中一个元素的状态会更改这两个列表中该元素的状态。但是,从一个列表中删除引用并不会从另一个列表中删除引用(因为每个列表都是一个单独的对象)。