java new ArrayList< >(list);“在这儿吗?

aurhwmvo  于 2023-10-14  发布在  Java
关注(0)|答案(3)|浏览(101)
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);
    }
}

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

kfgdxczn

kfgdxczn1#

写入new ArrayList<>(list)将创建一个新列表,其中包含list中的所有元素。这是必需的,因为在调用list.remove(list.size()-1);的函数结束时,您将修改list变量。
如果直接在res中添加list,则remove调用也会修改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.
        }
    }
}
g2ieeal7

g2ieeal72#

new ArrayList<>(list)将复制list,这将确保元素存储到res中。
否则,在list.remove(list.size()-1)之后,res中的元素将被删除。

rggaifut

rggaifut3#

在Java中,当我们向集合中添加一个对象时,它会作为引用被添加到主集合中。但是如果我们在对象中进行更改,那么这些更改也会反映到主集合中。
在这种情况下,我们需要删除'list'的最后一个元素,以进行回溯,这也会导致删除'res' arraylist中的元素。所以我们必须创建一个“list”的深层副本作为“res.add(new ArrayList<>(list))”来维护更改。

相关问题