将一个列表项添加到另一个列表
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:,我只是想知道上述两种方法有何不同,以及使用其中一种方法的权衡是什么?
list2
将只是对 list1
的引用。对其中任何一个的任何更改都将应用于两者(实际上两者只是对同一列表的引用)。
- 在此之后您将可以访问
list1
和 list2
,并且两者都有不同的引用,这意味着对一个的更改不会影响另一个。
如果你写
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
包含对象并且其中一个对象发生变化,它将在 list1
和 list2
中都发生变化(因为列表包含对对象的引用,而不是值)。
这就是说,正确的方法取决于你想做什么。
如果你想引用 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);
我必须将一个列表的项目添加到另一个列表,首选方式是什么?为什么?
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:,我只是想知道上述两种方法有何不同,以及使用其中一种方法的权衡是什么?
list2
将只是对list1
的引用。对其中任何一个的任何更改都将应用于两者(实际上两者只是对同一列表的引用)。- 在此之后您将可以访问
list1
和list2
,并且两者都有不同的引用,这意味着对一个的更改不会影响另一个。
如果你写
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
包含对象并且其中一个对象发生变化,它将在 list1
和 list2
中都发生变化(因为列表包含对对象的引用,而不是值)。
这就是说,正确的方法取决于你想做什么。
如果你想引用 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);