我对行res.add(new ArrayList<Integer>(temp));
感到困惑。如果我只使用res.add(temp)
,你能告诉我为什么这是错的吗?
public void dfs(int[] nums, int index, List<List<Integer>> res, List<Integer> temp) {
res.add(new ArrayList<Integer>(temp));
for(int i = index; i < nums.length; i++) {
temp.add(nums[i]);
dfs(nums, i + 1, res, temp);
temp.remove(temp.size() - 1);
}
}
答案 0 :(得分:0)
变量temp
是对内存中对象的对象引用,在本例中是Integers
的列表。通过调用remove
上的temp
方法,您实际上会更改list
在内存中指向的temp
对象。因此,在for
循环后,您可能会在尝试使用temp
时获得一个空列表。
使用new ArrayList<Integer>(temp)
实际上会在内存中创建一个新的list of Integers
对象,原始temp
引用与之无关,换句话说,它不会引用新的list of Integer
宾语。所以这基本上是一个新的list of Integers
。