2016-07-20 38 views
0

我遇到问题。当我试图改变温度在下面的代码,结果被更新(我做的结果是什么):当我使用新运算符时,原始ArrayList更改

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.add(new ArrayList(list))这样的add方法有什么问题吗?

回答

0

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

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

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

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

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

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

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

发生这种情况时,result的第一个元素将更新为包含10000而非空列表的列表。所以result仍然是一个singleton列表,但它的一个元素现在也将是一个包含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]的列表。

相关问题