String 和 new String()的區別


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM