String和StringBuffer的傳參問題

關於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.方法中的變量是獨立存在的,屬於方法,他們的焦點是常量池中的數據,任何一方改變常量池中的值都會影響另一方,但是各自改變地址值是相互不影響的。不知道這樣的解釋可不可以,歡迎拍磚。

發佈了39 篇原創文章 · 獲贊 25 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章