1. 什麼是 String Pool
就是 JVM 中專門存放 String 的地方2. String Pool 的特性
1.相同的字面意義的字符創僅僅會在 String Pool 中存放一個
2.當我們創建 String 時, 比如 String a=“aa”; JVM 首先會在 String Pool 中搜索 “aa” ,如果搜索到了則將 reference 指向相應的內存地址,不會分配額外的內存。如果沒有找到相同的 value,則將 ”aa“ 添加至 pool 中並返回 reference。(這個叫做 interning )
3. 通過 String 構造器創建,比如 String newString =new String(“aa”),java compiler 會創建一個新的 object 並存入 heap 中。
4. 在 Java 7 開始,Java String Pool 存儲在 Java Heap 中,可以被 GC 回收,一定程度上可以減少 OOM。Java 7 之前存儲固定大小在 PermGen space 中。
3. String Pool 的特性的驗證
public class Test {
public static void main(String[] args) {
String constantString1 = "Baeldung";
String constantString2 = "Baeldung";
System.out.println(constantString1 == constantString2);
}
}
true
可以說明 1,2
public class Test {
public static void main(String[] args) {
String constantString1 = "Baeldung";
String constantString2 = "Baeldung";
String constantString3 = new String("Baeldung");
System.out.println(constantString1 == constantString2);
System.out.println(constantString1 == constantString3);
System.out.println(constantString1.equals(constantString3));
}
}
true
false
true
說明 1,2,3
public class Test {
public static void main(String[] args) {
System.out.println(null instanceof String);
System.out.println(null instanceof Object);
String constantString = "interned Baeldung";
String newString = new String("interned Baeldung");
System.out.println(constantString == newString);
String internedString = newString.intern();
System.out.println(constantString == internedString);
}
}
false
true
手動 intern,可以重用 String,一定程度上節省內存