Java List.add(列表)和List.add(stringbuilder.toString)的差异

Java List.add(列表)和List.add(stringbuilder.toString)的差异,java,algorithm,deep-copy,n-queens,Java,Algorithm,Deep Copy,N Queens,我正在研究N皇后问题和生成括号问题 当您想要一个列表作为结果,并且想要将列表添加到其中时,您需要进行深度复制,对吗?如result.add(新数组列表(cur)) 但是当您想要一个列表作为结果时,您可以执行result.add(sb.toString())。 为什么将stringbuilder.toString添加到列表中不需要深度副本 谢谢你抽出时间 以下是代码的一部分。它们是递归函数的基本情况 N皇后区: public void helper(int n, List<Integer&

我正在研究N皇后问题和生成括号问题

当您想要一个
列表
作为结果,并且想要将
列表
添加到其中时,您需要进行深度复制,对吗?如
result.add(新数组列表(cur))

但是当您想要一个
列表作为结果时,您可以执行
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;
    }

public void helper(int n,List cur,List result){
如果(当前大小()==n){
**结果.添加(新ArrayList(cur))**
返回;
}
生成括号:

 private void helper(int n, StringBuilder sb, int left, int right, List<String> result) {
    if (sb.length() == n * 2){
      **result.add(sb.toString());**
    }
private void helper(int n、StringBuilder sb、int left、int right、列表结果){
如果(sb.length()==n*2){
**添加(sb.toString())**
}

Java本身无法实现深度复制,如果需要,必须手动实现


但是对于Java中的不可变字段,复制总是被认为是深度复制。我们讨论的是原语:int、byte和String。

sb.toString()
将stringbuilder的内容复制到字符串。顺便说一句,new ArrayList(cur)
是浅拷贝,不是深拷贝。哦,好的,我明白了。我认为这是浅拷贝
结果。添加(cur);