由ArrayList Initialization混淆

时间:2016-11-30 04:50:46

标签: java arraylist depth-first-search

我对行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);
    }
}

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