为什么 StringBuilder 的行为类似于按引用传递

Ano*_*oop 5 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:Default..........sB1sB2 为什么 StringBuilder 的工作方式类似于按引用传递?在 methodTest 中,我传递了两个对象 string 和 string builder。String 是按值传递的,但 StringBuilder 看起来像按引用传递,并且 StringBuilder 对象从调用方法中被更改。

Gil*_*anc 4

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

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

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

如果您不希望出现这种行为,则必须对传递的实例进行深层复制。如果您从公共 API 返回 Collection 类,您就会执行此操作。