在java中使用recusrion获得不同的结果stringbuilder与string

x6492ojm  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(235)

当我用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);
        }
    }

输出:[(()),(()),(()),(()),()(()),()(()),()]
有人能帮我理解为什么会这样吗?谢谢!!

kmbjn2e3

kmbjn2e31#

区别很简单 String 是不可变的:无论何时连接或以其他方式操纵 String 对象,你真的在创建一个新的 String 具有新值的对象。 StringBuilder 但是是可变的:您可以更改任何给定 StringBuilder 例如(这基本上是它存在的主要原因)。
所以在这一行:

generate(list, s.append("("), j+1, k, n);


修改 StringBuilder 安装
呼叫 generate 还有修改过的吗 StringBuilder 通话结束后
但是在

generate(list, s+"(", j+1, k, n);

而是你
创建新的 String 具有新值
呼叫 generate ,传递新值
s 仍然引用 generate 打电话。

相关问题