为什么“res.add(new ArrayList<>(list));” 这里?

Mor*_*rty 3 java

class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        List<Integer> list = new ArrayList<>();
        helper(res, list, root, sum);
        return res;
    }
    public void helper(List<List<Integer>> res, List<Integer> list, TreeNode root, int sum){
        list.add(root.val);
        if(root.left == null && root.right == null){
            if(root.val == sum)
                res.add(new ArrayList<>(list));
        }
        if(root.left != null)
            helper(res, list, root.left, sum-root.val);
        if(root.right != null)
            helper(res, list, root.right, sum-root.val);
        list.remove(list.size()-1);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在研究Leetcode 113. Path Sum II。这与问题本身无关。我想知道为什么我必须写res.add(new ArrayList<>(list));而不是res.add(list);直接写在第13行。

Pie*_*rcq 6

写入new ArrayList<>(list)会创建一个新列表,其中包含 中的所有元素list。这是必需的,因为在您调用的函数末尾list.remove(list.size()-1);,您正在修改list变量。

如果您list直接添加resremove调用也会修改res

另一个相关的例子:

class MyClass {
    public int modify = 5;
}

class Test {
    public static void myFunction() {
        MyClass object = new MyClass();
        System.out.println(object.modify); // prints 5.

        ArrayList<MyClass> myList = new ArrayList<>();
        myList.add(object);

        object.modify = 800;
        for(MyClass item : myList) {
            System.out.println(item.modify); // prints 800.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)