我必须将一个列表的项目添加到另一个列表中,首选方式是什么,为什么?
List<Integer> list1 = new ArrayList();
list1.add(1);
list1.add(2);
list1.add(3);
方法一:
List<Integer> list2 = list1;
方法#2:
List<Integer> list2 = new ArrayList();
list2.addAll(list1)
AFAIK 在第一种方法中,list1 的引用将分配给 list2,因此对 list1 的任何修改都会影响 list2,我正确吗?
使用 first 超过 second 或反之亦然有任何副作用吗?
提前致谢。
编辑:
我已经看到了 answer:,我只是想知道上述两种方法有何不同以及使用一种高于另一种方法的权衡是什么?
答案 0 :(得分:0)
library(dplyr)
test_df %>%
group_by(user_id) %>%
mutate(has_changed = if(any(flag == 'bbb' &
lag(flag) != 'bbb', na.rm = TRUE)) 'yes' else 'no') %>%
ungroup
# user_id flag order has_changed
# <dbl> <chr> <dbl> <chr>
# 1 1 aaa 1 yes
# 2 1 aaa 2 yes
# 3 1 aaa 3 yes
# 4 1 bbb 4 yes
# 5 2 bbb 1 no
# 6 2 bbb 2 no
# 7 3 aaa 1 yes
# 8 3 aaa 2 yes
# 9 3 bbb 3 yes
#10 4 ccc 1 no
#11 4 aaa 2 no
#12 4 aaa 3 no
#13 4 aaa 4 no
#14 4 aaa 5 no
将仅成为对 list2
的引用。对它们中的任何一个进行的任何更改都将应用于两者(实际上两者都只是对同一列表的引用)。list1
和 list1
,并且两者都有不同的引用,这意味着对一个的更改不会影响另一个。答案 1 :(得分:0)
如果你写
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
。
答案 2 :(得分:0)
AFAIK 在第一种方法中,list1 的引用将分配给 list2,因此对 list1 的任何修改都会影响 list2,我正确吗?
是的,你说得对。 List<Integer> list2 = list1;
表示您有多个变量指向同一个 List
。如果您更改一个列表的内容,也会更改另一个列表的内容。
使用 first 超过 second 或反之亦然有任何副作用吗?
使用第二种方法时,您将拥有多个包含相同元素的独立列表。如果您随后添加/删除项目(或类似项目),更改将不会反映到其他 List
。
事实上,您甚至可以将 Collection
传递给 ArrayList
的构造函数来做同样的事情:
List<Integer> list2=new ArrayList<>(list2);