基本數據類型由於長度固定,且需要空間比較少,所以直接存儲在棧中;而對象比較大,所以棧中只存儲一個4btye的引用地址(邏輯地址)。
java中對String對象特殊對待,所以在heap區域分成了兩塊:
一塊是String constant pool,用於存儲java字符串常量對象(確切的說應該屬於方法區)。
另一塊用於存儲普通對象及字符串對象。
PS:字符串常量池,應該只是運行時常量池的一塊區域。此外整型(只有0-127)也在常量池中。
而string的創建有兩種方法:
String a = "abc";
String b=new String("abc");
對於第一種,jvm只會在String constant pool 中尋找是否已經存在"abc"常量:
如果有"abc" 常量,則返回;
如果沒有,則在常量池中創建該常量,並且將此常量的引用返回給String a;
對於第二種,jvm只在堆中創建字符串對象"abc” 。不會在常量池中創建。
雖然new String()方法並不會把"abc” 加入到String constant pool中,但是可以手動調用intern()將字符串對象加入到String constant pool中。
補充:JavaString的不可變性。