被 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.