天天看點

JavaSE學習(11):String類和StringBuffer類的差別一、主要差別二、String和StringBuffer作為參數傳遞的不同三、String和StringBuffer的互相轉換

一、主要差別

1.StringBuffer: 對象可變的字元序列,對象是變量,在堆上

2.String: 對象不可變的字元序列,對象是常量,在常量池

3.String 作為參數傳遞類似于基本資料類型作為參數傳遞 (對象的不可改變性)。

4.StringBuffer 作為參數傳遞就是引用資料類型傳遞(對象可以改變)

二、String和StringBuffer作為參數傳遞的不同

為了更好的說明它們作為參數傳遞時有什麼不同,我們通過一個例子來引入。

String作為參數傳遞
    StringBuffer作為參數傳遞
總結:
    String 作為參數傳遞類似于基本資料類型作為參數傳遞 (對象的不可改變性)。
    StringBuffer 作為參數傳遞就是引用資料類型傳遞(對象可以改變)

public class StringBufferTest1 {
    public static void main(String[] args) {
        String s1 = "Hello";
        String s2 = "world";
        System.out.println("s1 = " + s1);  // Hello
        System.out.println("s2 = " + s2); // world
        change(s1, s2);
        System.out.println("s1 = " + s1); // Hello
        System.out.println("s2 = " + s2); // world

        System.out.println("----------------------------");
        StringBuffer sb1 = new StringBuffer("Hello");
        StringBuffer sb2 = new StringBuffer("world");
        System.out.println("sb1 = " + sb1); // Hello
        System.out.println("sb2 = " + sb2); // world
        change(sb1, sb2);
        System.out.println("sb1 = " + sb1); // Hello
        System.out.println("sb2 = " + sb2); // worldworld
    }
    private static void change(StringBuffer sb1, StringBuffer sb2) {
        sb1 = sb2;
        sb2 = sb1.append(sb2);
    }
    private static void change(String s1, String s2) {
        s1 = s2;
        s2 = s1 + s2;
    }
}
           

輸出的結果如上面注釋所示,可以知道因為StringBuffer的對象可以改變,輸出後的值也發生了變化,再通過一張圖來了解。

JavaSE學習(11):String類和StringBuffer類的差別一、主要差別二、String和StringBuffer作為參數傳遞的不同三、String和StringBuffer的互相轉換

在圖中,因為String類指向常量池,而StringBuffer類指向堆,雖然通過字元串拼接,string類建立了一個新的對象 ,但是并沒有指向該對象位址,而StringBUffer類在對象本身進行了改變,位址仍然指向該對象,是以,可以更好的了解。

三、String和StringBuffer的互相轉換

String-->StringBUffer
不能把字元串的值直接指派給StringBuffer,
StringBuffer sb="hello";
那怎麼轉呢?
//方式1:通過構造方法
StringBuffer sb=new StringBuffer(s);
//方式2:通過append方法

StringBuffer-->String
StringBuffer buffer=new StringBuffer("java");
//方式1:通過構造方法
String str=new String(buffer);
//方式2:通過toString()方法
String str2=buffer.toString();