当我用stringbuilder作为参数运行下面的代码时,我得到了不同的输出:
public static List<String> generateParenthesis(int n) {
if(n==0)
return new ArrayList<String>();
List<String> list = new ArrayList<>();
generate(list, new StringBuilder(), 0, 0, n);
return list;
}
public static void generate(List<String> list, StringBuilder s, int j, int k, int n)
{
if(s.length()>2*n || j>n || k>n || k>j)
return;
if(s.length()==2*n && j==n && k==n)
{
list.add(s.toString());
return;
}
if(j<n)
{
generate(list, s.append("("), j+1, k, n);
}
if(k<j)
{
generate(list, s.append(")"), j, k+1, n);
}
}
输出:[(())]
当我用param作为字符串运行相同的代码时,得到的输出不同:
if(n==0)
return new ArrayList<String>();
List<String> list = new ArrayList<>();
generate(list, "", 0, 0, n);
return list;
}
public static void generate(List<String> list, String s, int j, int k, int n)
{
if(s.length()>2*n || j>n || k>n || k>j)
return;
if(s.length()==2*n && j==n && k==n)
{
list.add(s.toString());
return;
}
if(j<n)
{
generate(list, s+"(", j+1, k, n);
}
if(k<j)
{
generate(list, s+")", j, k+1, n);
}
}
输出:[(()),(()),(()),(()),()(()),()(()),()]
有人能帮我理解为什么会这样吗?谢谢!!
1条答案
按热度按时间kmbjn2e31#
区别很简单
String
是不可变的:无论何时连接或以其他方式操纵String
对象,你真的在创建一个新的String
具有新值的对象。StringBuilder
但是是可变的:您可以更改任何给定StringBuilder
例如(这基本上是它存在的主要原因)。所以在这一行:
你
修改
StringBuilder
安装呼叫
generate
还有修改过的吗StringBuilder
通话结束后但是在
而是你
创建新的
String
具有新值呼叫
generate
,传递新值有
s
仍然引用generate
打电话。