宣告
宣告String有兩種方式 :
宣告String有兩種方式 :
String str1 = "abc"; String str2 = new String("abc");雖然這兩種方式都可以宣告String的物件,但JVM對於這兩種的處理方式是不一樣的。第一種首先會在String Pool中尋找是否存在,如果有就從String Pool回傳該String物件,反之將該常量新增到String Pool中。第二種則會在Heap Memory新增一個物件,而不是String Pool中。
String Pool
String Pool是Java Heap Memory中儲存String的一個區域。當使用常量(literal)方式宣告String物件JVM會從String Pool檢查是否有相同的字串,如果有將會從String Pool回傳該實例,而不會重分配新的記憶體,從而達到節省記憶體的目的。
例子:
String str1 = "abc"; String str2 = "abc";
使用new關鍵字宣告的方式就會在Heap Memory新增一個字串,而不管該字串是否在String Pool中。
String str3 = new String("abc"); String str4 = new String("abc");
我們看以下的code就能更加清楚。
public class Test { public static void main(String args[]) { String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); String str4 = new String("abc"); System.out.println(str1==str2); System.out.println(str1==str3); System.out.println(str3==str4); System.out.println(str1==str3.intern()); } }
執行的結果是
true
false
false
true
==只能判定兩個instance是否指向同一個記憶體位址(M.A),而不是M.A裡面的內容。從結果可以看出 str1==str2 是true原因是雙方都是指向在String pool裡面同一個M.A,反之str1==str3會是false。
雖然str3的內容和str1一樣,但因為宣告方式的不同造成str3不會在String pool裡面尋找,而是直接在Heap memory重新分配新的M.A給str3。str3==str4是false也是M.A的不同。在String有一個方法可以先從String Pool裡面尋找該內容那就是intern()。str1==str3.intern()是true是可以預料的,str3調用intern()方法造成str3指向的M.A會和str1一樣。
雖然str3的內容和str1一樣,但因為宣告方式的不同造成str3不會在String pool裡面尋找,而是直接在Heap memory重新分配新的M.A給str3。str3==str4是false也是M.A的不同。在String有一個方法可以先從String Pool裡面尋找該內容那就是intern()。str1==str3.intern()是true是可以預料的,str3調用intern()方法造成str3指向的M.A會和str1一樣。
沒有留言:
張貼留言