如果我创建一个列表并添加十个元素,然后将列表对象复制到另一个,并在第二个列表上调用list.clear,则清除这两个列表。
Random random = new Random();
List<Double> list1 = new ArrayList<Double>();
List<Double> list2 = new ArrayList<Double>();
for (int i = 0; i < 10; i++) {
list1.add(random.nextDouble());
}
list2 = list1; //Both lists have ten elements
list1.clear(); //Both lists are now empty
这是正常的吗?我错过了什么吗?
如果我遍历第一个列表并逐个添加元素,则不会发生这种情况,只有list2 = list1
行。
答案 0 :(得分:5)
list2 = list1; //Both lists have ten elements
这不会将list1
复制到list2
。它使变量list2
与list1
引用相同的列表。两个变量都指向同一个列表对象。
<强>之前强>
list1 -----> [ArrayList #1]
list2 -----> [ArrayList #2]
<强>后强>
list1 --+--> [ArrayList #1]
|
list2 --+ [ArrayList #2] (orphaned, will be garbage collected)
要将第一个列表的元素复制到第二个列表,请执行:
list2.addAll(list1);
(如果list2
没有空,您还需要list2.clear()
。)
答案 1 :(得分:2)
list2 = list1;
这不会将list1
复制到list2
,但会使list2
引用(指向)list1。由于list1
和list2
现在指向相同的列表,因此如果您使用list1
或list2
并不重要,因为两者都将在同一列表中执行操作
如果要复制它,请执行(添加元素后):
final List<Double> list2 = new ArrayList<Double>(list1);
这也意味着List<Double> list2 = new ArrayList<Double>()
是多余的。
答案 2 :(得分:1)
我认为这是因为两个列表都指向内存中的相同值。只需使用foreach循环填充列表。