5

检查此代码

   public class StringbuilderDoubt {

    public static void main(String args[]){
           new StringbuilderDoubt().methodTest();
    }

    public void methodTest(){
        String str=new String("Default");
        StringBuilder sb=new StringBuilder();
        sB1(str,sb);
        sB2(str,sb);
        System.out.println(str+".........."+sb);
    }
    private void sB1(String str1, StringBuilder sb1){
                    str1+="str1";
                    sb1.append("sB1");
    }

    private void sB2(String str2, StringBuilder sb2){
        str2+="str2";
        sb2.append("sB2");
    }
}

输出是:Default..........sB1sB2 为什么 StringBuilder 像通过引用传递一样工作?在 methodTest 我传递了两个对象字符串和字符串生成器。String 是按值传递的,但 StringBuilder 看起来像是通过引用传递,而调用方法的 StringBuilder 对象发生了变化。

4

3 回答 3

3

当您将 StringBuilder 实例传递给方法时,实例值是按值传递的。如您所见,您可以将字符附加到方法内部的 StringBuilder 实例,而无需返回实例值。

如果需要,您也可以返回 StringBuilder 实例值,但这不是必需的。它没有改变。

这种“通过引用传递”也适用于大多数 Collection 类(List、Map)以及您自己的具有 getter 和 setter 的类。

如果您不希望这种行为,则必须对您传递的实例进行深层复制。如果您从公共 API 返回 Collection 类,您会这样做。

于 2013-02-11T17:42:58.853 回答
1

因为它通过引用传递的。对 的引用是按StringBuilder值传递的。您可以添加字符,它们将在方法返回后出现在实例中。同样的方式你可以传递一个集合并在调用方法中添加值 - 这些将被保留。您也可以调用 setter 或分配公共字段,这样的更改在返回后也会持续存在。

对的引用String也是按值传递的,因此在方法返回后为该引用分配新值无效。

于 2013-02-12T07:44:21.777 回答
1

我认为这里没有任何问题StringBuilder

引用所引用的字符串没有任何反应str。在您的sB1方法中,您有一个本地参考str1。"+=" 运算符返回一个新字符串,但原始字符串是不可变的,不会更改。同样的事情发生在你的sB2方法中。

因此,您的变量str仍然只包含“默认”。

于 2013-02-11T17:42:29.303 回答