Java字串常量和static物件的區別
阿新 • • 發佈:2019-01-04
java中將記憶體分為四個區:heap、stack、data segment、code segment;
字串常量和靜態變數都存於資料區;字串常量存於資料區,如果內容相同,則地址指向相同;靜態變數也存於資料區,如果內容也相同,那麼如何呢?
/*
2018-1-19 17:51:01
該程式證明了常量與物件的區別
字串常量 與靜態String new出來的物件內容可能相同 且都存於資料區, 但是地址指向完全不同
兩個內容相同的字串常量 都存於資料區,但其地址指向相同
無論在什麼區 new出來的物件 應是先分配記憶體,後進行物件內容的賦值 所以地址指向不同
字串常量在資料區,會比較內容的異同 故 內容相同的字串常量 地址指向相同
兩者之間應區分明白
*/
class String_static { static String str1 = new String("abc"); static String str4 = new String("abc"); public static void main(String[] args) { String str3 = new String("abc"); String str6 = new String("abc"); String str2 = "abc"; String str5 = "abc"; System.out.println(str1.equals(str2) ); // equals方法比較的是指向的物件,也就是其中的內容,與地址無關 System.out.println(str2 == str5); // str2 和 str5 的物件存於資料區,但由於內容相同,故指向了同一塊記憶體 System.out.println(str3 == str6); // str3 和 str6 new出來 的物件都存於堆區中,雖然物件內容相同,但在堆中指向並不是一塊記憶體 System.out.println(str1 == str4);//str1 和 str4 因為是靜態的,雖然也是new出來的,且其物件內容也相同,也都存於資料區,但是地址指向完全不同 與str2 和str5 的情況形成比較; 與str3和str6 雖然不在同一區,但是情況類似 System.out.println(str1 == str3);//str1 存在於資料區 ,str3 存在於堆區,地址指向完全不同 System.out.println(str1 == str2);//str1 因為是靜態的 存於資料區 str2是字串常量 也存於資料區 且物件內容等,但地址指向並不相同;與str2 和str5 的情況形成比較;,與str1 和 str4 、str3和str6類似 } }