Java中String直接賦值和使用new的區別
String str1 = "ABC";
String str2 = new String("ABC");
String str1 = “ABC”;可能建立一個或者不建立物件,如果”ABC”這個字串在java String池裡不存在,會在java String池裡建立一個建立一個String物件(“ABC”),然後str1指向這個記憶體地址,無論以後用這種方式建立多少個值為”ABC”的字串物件,始終只有一個記憶體地址被分配,之後的都是String的拷貝,Java中稱為“字串駐留”,所有的字串常量都會在編譯之後自動地駐留。
String str2 = new String(“ABC”);至少建立一個物件,也可能兩個。因為用到new關鍵字,肯定會在heap中建立一個str2的String物件,它的value是“ABC”。同時如果這個字串再java String池裡不存在,會在java池裡建立這個String物件“ABC”。
在JVM裡,考慮到垃圾回收(Garbage Collection)的方便,將heap(堆)劃分為三部分:young generation(新生代)、tenured generation (old generation)(舊生代)、permanent generation(永生代)。
字串為了解決字串重複問題,生命週期長,存於pergmen中。
JVM中,相應的類被載入執行後,常量池對應的對映到JVM執行時的常量池中。
考慮下面的問題:
String str1 = new String("ABC");
String str2 = new String("ABC");
str1 == str2的值是true還是false呢?false
String str3 = "ABC";
String str4 = "ABC";
String str5 = "AB" + "C";
str3 == str4 //true
str3 == str5 // true
String a = "ABC";
String b = "AB";
String c = b + "C";
System.out.println( a == c );//false
a、b在編譯時就已經被確定了,而c是引用變數,不會在編譯時就被確定。
應用的情況:建議在平時的使用中,儘量使用String = “abcd”;這種方式來建立字串,而不是String = new String(“abcd”);這種形式,因為使用new構造器建立字串物件一定會開闢一個新的heap空間,而雙引號則是採用了String interning(字串駐留)進行了優化,效率比構造器高。