被 ArrayList 初始化搞糊涂了
Confused by ArrayList Initialization
我对 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);
}
}
变量temp
是对内存中对象的对象引用,在本例中是Integers
的列表。通过在 temp
上调用 remove
方法,您实际上改变了 temp
在内存中指向的 list
对象。因此,在 for
循环之后,您可能会在尝试使用 temp
.
时得到一个空列表
使用new ArrayList<Integer>(temp)
实际上在内存中创建了一个新的list of Integers
对象,原来的temp
引用与它没有任何关系,换句话说它不引用新的[=21] =]对象。所以这基本上是一个新的 list of Integers
.
我对 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);
}
}
变量temp
是对内存中对象的对象引用,在本例中是Integers
的列表。通过在 temp
上调用 remove
方法,您实际上改变了 temp
在内存中指向的 list
对象。因此,在 for
循环之后,您可能会在尝试使用 temp
.
使用new ArrayList<Integer>(temp)
实际上在内存中创建了一个新的list of Integers
对象,原来的temp
引用与它没有任何关系,换句话说它不引用新的[=21] =]对象。所以这基本上是一个新的 list of Integers
.