写点什么

读 Guide to Java String Pool

用户头像
shengjk1
关注
发布于: 2020 年 04 月 30 日

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,一定程度上节省内存



4. 参考



[Guide to Java String Pool](https://www.baeldung.com/java-string-pool)



发布于: 2020 年 04 月 30 日阅读数: 52
用户头像

shengjk1

关注

还未添加个人签名 2018.04.26 加入

博客 https://blog.csdn.net/jsjsjs1789

评论

发布
暂无评论
读 Guide to Java String Pool