就是 JVM 中专门存放 String 的地方
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 中。
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,一定程度上节省内存