第18行为什么在新建的一维数组ArrayList的小括号里写填一维数组?

第18行为什么在新建的一维数组ArrayList的小括号里写填一维数组?
但写成res.add(output);的话就错了.
这两写法有啥区别吗?

img

无论在力扣上,还是直接jdk编译都是能通过的。

img

img

这个操作是可以通过编译运行的。没有任何问题

public void t(List<Integer> obj,List<List<Integer>> res){
        res.add(obj);
    }

应该都可以。new的作用是重新初始化,分配内存空间。


class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();

        List<Integer> output = new ArrayList<>();
        for(int num : nums){
            output.add(num);
        }

        int n = nums.length;
        backtrack(n, output, res , 0);
        return res;
        
    }

    public void backtrack(int n, List<Integer> output, List<List<Integer>> res, int first){
        if(first == n){
            res.add(new ArrayList<>(output));
        }

        for(int i = first; i < n; i++){
            Collections.swap(output, first, i);

            backtrack(n ,output , res, first+1);

            Collections.swap(output, first, i); //回溯法:紧跟递归调用的后面写撤销操作
        }
    }
}

没错的。如果IDE报错,可以试试清下缓存重启电脑

如果直接用 res.add(output) ,那下面的 Collections.swap(output, first, i) 操作就会影响到res中的结果,重新new ArrayList<>(output)对象,即时下面对output对象进行了操作,也不会影响到res.add(new ArrayList<>(output))添加到res中的对象。

并不是简单的语法问题

下面是演示

        List<Integer> originList = Stream.of(1, 2, 3).collect(Collectors.toList());
        System.out.println("原始数组为:" + originList);
        List<Integer> integerList = new ArrayList<>(originList);
        Collections.swap(originList, 1, 2);
        System.out.println("swap后,原始数组:" + originList);
        System.out.println("swap后,拷贝数组:" + integerList);

结果如下:

img