明明都是引用类型,为啥StringBuffer和String给方法传递参数时,会有以下代码这样的区别?

明明都是引用类型,为啥StringBuffer和String给方法传递参数时,会有以下代码这样的区别?

package test_heima;

public class Demo10 {

    public static void main(String[] args) {
        String s1 = "aaa";
        System.out.println(s1);
        change(s1);
        System.out.println(s1);
        
        StringBuffer s2 = new StringBuffer();
        s2.append("kkk");
        System.out.println(s2);
        change(s2);
        System.out.println(s2);
        
        
    }

    public  static void change(StringBuffer s) {
        s.append("zzz");
    }

    public static void change(String s) {
        s += "bbb";
    }

}

以下代码结果为

aaa
aaa
kkk
kkkzzz
阅读 4k
4 个回答

String是不可变的。

String str1 = "abc";
str1 + "zzz";  //这个操作将产生一个新的字符串,相当与 String str2 = str1 + "zzz";

StringBuffer sb = new StringBuffer("abc");
sb.append("zzz"); // 会改变里面的值并返回自己,但不会产生一个新的StringBuffer

(由于StringBuffer为了多线程安全的,每个方法都加锁了(synchronized),所以效率比较低,一般都用StringBuidler。另外,如果刚开始学习Java,建议你把《Java程序设计语言(第4版)》多看几遍,这样比上网学习效率更高,基础更扎实)

s += "bbb"改变方法参数了,对方法外是不起作用的。

推荐问题
宣传栏