java 如何将List添加到List &lt;List&gt;?< Integer> to List&lt;List< Integer>&gt;?

tcbh2hod  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(137)

Leetcode 113 Path Sum II的问题解决方案如下:

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        dfs(root, targetSum, new ArrayList<>());
        return res;
    }
    private void dfs (TreeNode node, int targetSum, List<Integer> list) {
        if (node == null) return;
        list.add(node.val);
        if (targetSum == node.val && node.left == null && node.right == null) {
          **  res.add(new ArrayList<>(list));**
        }else {
            if (node.left != null) dfs(node.left, targetSum - node.val, list);
            if (node.right != null) dfs(node.right, targetSum - node.val, list);

        }
        list.remove(list.size() - 1);
    }

}

例如,当我将res.add(new ArrayList<>(list))更改为res.add(list)时,我得到的res为[[],[]],它应该像这样[[5,4,11,2],[5,8,4,5]]
为什么不能直接使用res.add(list);?列表由ArrayList<>()定义。
我检查了相关的答案,知道有两种方法来定义一个二维数组:

  1. List<List<Integer>> res = new ArrayList<List<Integer>>();
  2. List<List<Integer>> res = new ArrayList<>();
    我知道List是一个接口,而ArrayList是一个Collection类。我还是很困惑。
t2a7ltrp

t2a7ltrp1#

  • "...例如,当我将res.add(new ArrayList<>(list))更改为res.add(list)时,我得到的res为[[],[]],它应该像这样[[5,4,11,2],[5,8,4,5]]。..."*

这是因为 list 是一个对象,所以它在这里仍然会受到影响,

list.add(node.val);

还有这里

list.remove(list.size() - 1);

这可能会让人感到困惑,因为你会想象一个新的对象值会被传递。
通过使用 * res.add(new ArrayList<>(list)) *,您正在创建 list 的新副本-因此,它不会受到影响。
下面是特定的 ArrayList 构造函数方法的源代码。

  • GitHub - jdk/src/java.base/share/classes/java/util/ArrayList.java*.
  • "...而且我知道List是一个接口,而ArrayList是一个Collection类。我仍然对此感到困惑。"*

你说得对虽然,List 只是 Collections 框架中的一个接口。
从技术上讲,它仍然是一个集合。
下面是 List JavaDoc。List (Java SE 20 & JDK 20)
下面是 Collections Framework 的JavaDoc。

  • java.util(Java SE 20 & JDK 20)- Java集合框架 *。

最后,这里是一个关于 Collections Framework 的Java教程。

相关问题