处理列表时这是正确的行为吗?

时间:2015-07-20 17:23:37

标签: java list clear

如果我创建一个列表并添加十个元素,然后将列表对象复制到另一个,并在第二个列表上调用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行。

3 个答案:

答案 0 :(得分:5)

list2 = list1; //Both lists have ten elements

这不会将list1复制到list2。它使变量list2list1引用相同的列表。两个变量都指向同一个列表对象。

<强>之前

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。由于list1list2现在指向相同的列表,因此如果您使用list1list2并不重要,因为两者都将在同一列表中执行操作

如果要复制它,请执行(添加元素后):

final List<Double> list2 = new ArrayList<Double>(list1);

这也意味着List<Double> list2 = new ArrayList<Double>()是多余的。

答案 2 :(得分:1)

我认为这是因为两个列表都指向内存中的相同值。只需使用foreach循环填充列表。