【https://www.toutiao.com/i6500028613331517965/】
對於字符串:其對象的引用都是存儲在棧中的,如果是【編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中】,如果是【運行期(new出來的)才能確定的就存儲在堆中】。對於equals相等的字符串,在常量池中永遠只有一份,在堆中有多份。
如以下代碼:
Java代碼
String s1 = "china";
String s2 = "china";
String s3 = "china";
String ss1 = new String("china");
String ss2 = new String("china");
String ss3 = new String("china");
String s=new String("china");
s 是對象的引用,存放在棧中,棧是存放基本類型的變量數據和對象的引用
new String("china");是對象本身(也就是對象),存放在堆(new 出來的對象) 。
"china" 存放在常量池,(字符串常量對象存放在常量池中) 。
這裏解釋一下黃色這3個箭頭,對於通過new產生一個字符串(假設爲”china”)時,會先去常量池中查找是否已經有了”china”對象,如果沒有則在常量池中創建一個此字符串對象,然後堆中再創建一個常量池中此”china”對象的拷貝對象。
這也就是有道面試題:String s = new String(“xyz”);產生幾個對象?一個或兩個,如果常量池中原來沒有”xyz”,就是兩個。