String 和 new String()的區別
For Example
String str1 = "ABC"
String str2 = new String("ABC");
String str1 = "ABC"; 可能建立一個對象或者不建立對象。
若是"ABC" 這個字符串z在java String池中不存在,會在java String池中建立一個String str1= "ABC"的對象。而後把str1指向這個內存地址。以後用這種方式建立多少個值爲"ABC"的字符串對象。始終只有一個內存地址被分配,以後都是String的copy。這種被稱爲‘字符串駐留’,全部的字符串都會在編譯以後自動駐留。
String str2 = new String("ABC"); 至少會建立一個對象,也可能2個。
由於用到了new的關鍵字,確定會在heap中建立一個str2的對象。它的value值是"ABC",同時若是這個字符串在string池中不存在,會在string詞中建立這個string對象"ABC"。
String str1 = new String("ABC");
String str2 = new String("ABC");
System.out.println(str1.equals(str2)); // true 比較的值
System.out.println(str1 == str2); // false 比較的是內存地址。
String str3 = "ABC"
String str4 = "ABC"
String str5 = "AB"+"C";
System.out.println(str3 == str4); //true 在string池中都是一個內存地址被分配給str3,str4,str5
System.out.println(str3 == str5); //true
String str6 = "AB";
String str7 = str6 + "C";
System.out.println(str3 == str7); //false
str6在編譯的時候已經確認爲string池的對象。
str7在編譯的時候不能確認,故str7是一個引用變量。
str6+"C"的過程是建立了一個StringBuffer對象,而後用StringBuffer對象執行append方法追加,最後再轉成String類型,也就是str7是放在heap裏面的對象,str6是放在String常量池裏的。兩個的內存地址不同。故結果爲false。