为什么StringBuilder就像传递引用一样

时间:2013-02-11 17:35:49

标签: java stringbuilder

检查此代码

   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中,我传递了两个对象字符串和字符串构建器。字符串是按值传递的,但StringBuilder看起来像是通过refence传递,而StringBuilder对象来自调用方法的更改。

3 个答案:

答案 0 :(得分:1)

我在这里看到StringBuilder没有任何问题。

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

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

答案 1 :(得分:1)

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

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

这个“按引用传递”也适用于大多数Collection类(List,Map),以及适用于拥有getter和setter的类。

如果您不想要此行为,则必须对传递的实例进行深层复制。如果从公共API返回Collection类,则可以执行此操作。

答案 2 :(得分:0)

因为通过引用传递。 StringBuilder引用按值传递。您可以添加字符,它们将在方法返回后出现在实例中。您可以通过相同的方式传递Collection并在invoke方法中添加值 - 这些将被保留。您也可以调用setter或指定公共字段,这些更改也会在返回后保留。

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

相关问题