【问题标题】:Difference on List.add(list) and List.add(stringbuilder.toString)List.add(list) 和 List.add(stringbuilder.toString) 的区别
【发布时间】:2020-10-27 22:51:39
【问题描述】:

我正在研究 N Queens 问题和 Generate Parentheses 问题。

当你想要一个List<List<Integer>> 作为结果,并且你想将List<Integer> 添加到它上面时,你需要做一个深拷贝吗?赞result.add(new ArrayList<Integer>(cur))

但是当你想要List<String> 作为结果时,你可以使用result.add(sb.toString())。 为什么将 stringbuilder.toString 添加到列表中不需要深拷贝?

感谢您的宝贵时间

以下是部分代码。它们是递归函数的基本情况。

N 个皇后区:

 public void helper(int n, List<Integer> cur, List<List<Integer>> result){
    if (cur.size() == n){
      **result.add(new ArrayList<Integer>(cur));**
      return;
    }

生成括号:

 private void helper(int n, StringBuilder sb, int left, int right, List<String> result) {
    if (sb.length() == n * 2){
      **result.add(sb.toString());**
    }

【问题讨论】:

  • sb.toString() 复制字符串生成器的内容到一个字符串。
  • 顺便说一句 new ArrayList&lt;Integer&gt;(cur) 是浅拷贝,而不是深拷贝。
  • 哦,好的,我明白了。我以为这是浅拷贝result.add(cur);

标签: java algorithm deep-copy n-queens


【解决方案1】:

Java 本身无法实现深拷贝,如果需要,必须手动实现。

但是对于 Java 中的不可变字段,复制始终被视为深层复制。我们谈论的是原语:int、byte、.. 和 String。

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    相关资源
    最近更新 更多