一、主要差別
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的對象可以改變,輸出後的值也發生了變化,再通過一張圖來了解。
在圖中,因為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();