字符串存放的位置有两个:字符串常量池和堆内存。
- 使用常量字符串初始化的字符串对象,它的值存放在字符串常量池中;
String str = "Hello World!";
- 使用字符串构造方法创建的字符串对象,它的值存放在堆内存中;
String str = new String("Hello World!");
JDK 1.7之前,字符串常量池是在PermGen区域;
JDK1.7之后,字符串常量池移到了堆内存中,并且可以被垃圾收集器回收。
intern方法
String提供了一个API: java.lang.String.intern(),它可以手动将一个字符串对象的值存储到到字符串常量池中。
intern方法的实现底层是一个native方法,在Hotspot JVM里字符串常量池它的逻辑在注释里写得很清楚:如果常量池中有这个字符串常量,就直接返回,否则将该字符串对象的值存入常量池,再返回。
网友评论