将一个列表项添加到另一个列表

Adding one list items to another list

我必须将一个列表的项目添加到另一个列表,首选方式是什么?为什么?

List<Integer> list1 = new ArrayList();
list1.add(1);
list1.add(2);
list1.add(3);

方法一:

List<Integer> list2 = list1;

方法二:

List<Integer> list2 = new ArrayList();   
list2.addAll(list1)

据我所知,在第一种方法中,list1 的引用将分配给 list2,因此对 list1 的任何修改都会影响 list2,我说得对吗?

使用 first over second 或反之亦然有任何副作用吗?

提前致谢。

编辑:

我已经看到 answer:,我只是想知道上述两种方法有何不同,以及使用其中一种方法的权衡是什么?

  1. list2 将只是对 list1 的引用。对其中任何一个的任何更改都将应用于两者(实际上两者只是对同一列表的引用)。
  2. 在此之后您将可以访问 list1list2,并且两者都有不同的引用,这意味着对一个的更改不会影响另一个。

如果你写

List<Integer> list2 = list1;

...您正在使 list2 指向 list1。如果 list1 改变,list2 也会改变。如果它被处置,list2 也将被处置。

例如:

list2 = list1;
list1.remove(3); //<-- list2 will also reflect remove(3)
list1.add(4); //<-- list2 will also get a 4 at the end of the list

如果你使用

list2.addAll(list1);
//or list2 = new ArrayList<>(list1);

... 然后您将创建一个独立于第一个列表的新列表,其中包含元素的副本(顺序相同)而不是 list1 在您初始化它的那一刻. 这两个列表在结构上将完全独立。

list2.addAll(list1);
list1.remove(3); //<-- list 2 is unchanged
list1.add(4); //<-- list 2 is unchanged

请注意,如果 list2 包含对象并且其中一个对象发生变化,它将在 list1list2 中都发生变化(因为列表包含对对象的引用,而不是值)。

这就是说,正确的方法取决于你想做什么。 如果你想引用 list1 到另一个对象,并希望它是 list1 的镜像,那么就使用方法 1。 但最有可能的是,您只想在给定时刻复制一份 list1,因此在这种情况下,您应该使用 list2.

AFAIK that in first method list1's reference will be assigned to list2 so any modification to list1 will effect to list2, Am i correct ?

是的,你是对的。 List<Integer> list2 = list1; 意味着你有多个变量指向同一个 List。如果您更改一个列表的内容,这也会更改另一个列表的内容。

Is there any side effect of using first over second or vice-versa ?

使用第二种方法时,您将拥有多个包含相同元素的独立列表。如果您随后 add/remove 项(或类似项),更改将不会反映到其他 List

事实上,您甚至可以将 Collection 传递给 ArrayList 的构造函数,做同样的事情:

List<Integer> list2=new ArrayList<>(list2);