JAVA學習.String不變性&StringBuffer&StringBuilder

String類創建的時候的內存圖:(結合代碼)



/**
 * 
 */

/**
 * @author fshxxxyydys
 *
 */
public class StringInvariance {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String str1 = new String( "fshxxxyydys");
		String str2 = new String( "fshxxxyydys");
		
		System.out.println(str1 == str2); 
		//只有str1和str2指向同一個對象的時候才能相等
		//用new暗示系統爲新的對象開闢一個新的空間
		//此時即使內存(堆)中已經存在了一個一樣的對象
		//系統也不會將新的引用變量(指針)指向它,而是爲新的對象開闢
		//一塊新的內存空間,所以此時str1和str2不相等
		
		System.out.println(str1.equals(str2));
		//比較兩個引用變量指向的對象的內容是否相等
		
		
		String c1 = "fshxxxyydys";
		String c2 = "fshxxxyydys";
		System.out.println(c1 == c2);
		//java中字符串使用頻繁,爲了提高效率,系統會將字符串進行緩存與複用
		//JAVA的字符串對象一旦被創建,不能修改,這種語法現象叫做
		//字符串的不變性(immutable String),在系統創建c2時,發現內存中已經
		//存在了一個“fshxxxyydys”對象,而且沒有收到要爲新對象創建新的內存
		//的暗示“new”使用就直接將c2指向了系統已經存在的“fshxxxyydys”對象
		//所以此時才c1和c2相等
		
		
		c1 = c1.replace("x","O");
		System.out.println("c1="+ c1);
		System.out.println("c2="+c2);
		//java中一旦字符串確定,就不能修改,對任何字符串的修改
		//操作,最終都會產生新的字符串對象
		//以上操作中c1的指針被指向一個新的對象“fshOOOyydys”
		//因此此時c1和c2將不再相等
		System.out.println(c1 == c2);
		
		
		//由於每次產生新的對象,所以如果進行大量的String操作內存會很快的
		//消耗殆盡,JVM GC 要一直的工作,導致性能下降,如果有涉及到較多的字符串相加操作,
		//請使用StringBuffer類。
		//StringBuffer是線程安全的,速度較慢,如果你確定你的程序不需要線程安全
		//建議使用StringBuilder,其實StringBuffer的兄弟類,擁有完全一致的API,但是速度較快。
		StringBuffer strbf = new StringBuffer();
		strbf.append("fshx") //此函數返回的是strbf本身所以可以連續追加
		     .append("xx")
		     .append("yydys")
		     .append(888888)
		     .append(true);
		 
		System.out.println(strbf.toString());

	}

}
=======================================================================

Result:

false
true
true
c1=fshOOOyydys
c2=fshxxxyydys
false
fshxxxyydys888888true

=========================================================================


原創出處:http://blog.csdn.net/u012830807

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章