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
=========================================================================