当我使用new运算符时,原始ArrayList会更改

时间:2016-07-20 01:47:22

标签: java

我遇到了一个问题。当我尝试在以下代码中更改temp时更新结果(我对结果没有做任何事情):

List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
List<List<Integer>> temp = new ArrayList<>();
for (List<Integer> list: result) {
    list.add(10000);
    temp.add(new ArrayList(list));
}

我不知道为什么结果会变成[[10000]]和temp。像temp.add(new ArrayList(list))这样的add方法有什么问题吗?

1 个答案:

答案 0 :(得分:0)

编写的代码只循环一次。我们来看看:

List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());

这会初始化resultList,其元素为List<Integer>。然后,您将一个元素添加到结果中,因此result是单个元素列表。那个元素本身就是一个零元素列表。

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

在这里,您初始化temp也是List,其中包含List<Integer>作为其元素类型,但它是空的。

for (List<Integer> list: result) {
    list.add(10000);
    temp.add(new ArrayList(list));
}

请注意,result只有一个元素。那个元素是你在第2行给它的东西result.add(new ArrayList<>());。此循环将针对result的每个元素进行迭代,这将导致它仅循环一次,因为result只有一个元素。

发生这种情况时,result的第一个元素将更新为包含10000的列表,而不是空列表。因此result仍然是单例列表,但它的一个元素现在也将是包含10000的单例列表。

然后拨打temp.add(new ArrayList(list))。致电new ArrayList(list)会创建一个ArrayList,其中包含list所做的所有元素。当您致电时,list是包含10000的单身人士,因此new ArrayList(list)也是仅包含数字10000的单身人士。然后,您将ArrayList添加到temp,这是以前的空列表。现在,temp是一个单例,它的一个元素是一个包含10000的单例列表。

此时,resulttemp都是包含一个元素的列表,每个元素都是一个只包含一个元素的列表,即10000。这就是resulttemp具有值[[10000]]的原因,其中[10000]是仅包含数字10000的列表,[[10000]]是一个列表只包含[10000]