關於String和StringBuffer的區別這裏不再贅述,主要詳細說一下他們作爲形參的區別吧!
String雖然是非基本類型,但是最終傳遞的是一個內容的拷貝,在其他方法中對其操作不會影響實參值,具體的可以參看下面的網址:
http://www.cnblogs.com/alexlo/p/4106394.html
StringBuffer傳遞的確實地址值,在方法中對其操作就會改變其實參的內容。下面附上一段代碼:
public class StringBufferDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "hello";
String s2 = "world";
System.out.println(s1+"-------"+s2);
change(s1,s2);
System.out.println(s1+"-------"+s2);
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("world");
System.out.println(sb1+"-------"+sb2);
change(sb1,sb2);
System.out.println(sb1+"-------"+sb2);
}
private static void change(String s1, String s2) {
// TODO Auto-generated method stub
s1 = s2;
s2 = s1+s2;
}
private static void change(StringBuffer sb1, StringBuffer sb2) {
// TODO Auto-generated method stub
sb1 = sb2;
sb2.append(sb1);
/*System.out.println("----------------");
System.out.println(sb1);
System.out.println(sb2);
System.out.println("----------------");*/
}
}
運行結果如下:
hello-------world
hello-------world
hello-------world
hello-------worldworld
你可能會問StringBuffer不是傳的是地址嗎?那爲什麼sb1的內容不是world而是hello內,我也產生了同樣的問題。後來通過查閱資料請教他人,終於理解了。
下面我用圖給大家解釋一下,圖不太標準,但意思好理解。
大家可以再chang()方法中輸出sb1和sb2就可以自己看到結果了!如果解釋的不夠清楚歡迎交流溝通。
收到博友的建議說直接說sb1和sb2是局部變量有一些籠統,下面有再補充一下。首先局部變量大家應該都清楚,就是隨着方法的調用而存在,方法調用結束就消失了。所以chang方法中的sb1,sb2的地址值來事main方法中傳過來的sb1,sb2.但是對於chang方法中的sb1=sb2,只是將chang方法中sb1變量的地址改變了,但是並不影響main方法中的。而chang方法中sb2的內容改變是改變了常量池中的內容,進而影響了main方法中的sb2.方法中的變量是獨立存在的,屬於方法,他們的焦點是常量池中的數據,任何一方改變常量池中的值都會影響另一方,但是各自改變地址值是相互不影響的。不知道這樣的解釋可不可以,歡迎拍磚。