常量池分类: 静态常量池、运行时常量池
- 静态常量池 存在于class文件中,包含类定义,属性,方法
- 运行时常量池 JVM完成类加载后,将class加载入内存后保存在方法区,即平常说的常量池就是运行时常量池
字符串池1.7之后从方法区移到了堆区
String s1 = new String("he") + new String("llo");
String s2 = s1.intern();
System.out.println(s1 == s2);
// 在 JDK 1.6 下输出是 false
// 在 JDK 1.7 之后的版本输出是 true
在 JDK 1.6 中,调用 intern()
首先会在字符串池中寻找 equal()
相等的字符串,假如字符串存在就返回该字符串在字符串池中的引用;假如字符串不存在,虚拟机会重新在永久代上创建一个实例,将 StringTable 的一个表项指向这个新创建的实例
所以上图中JDK1.6 s1.intern产生的对象在方法区中,而s1对象在堆中,故输出false
在 JDK 1.7 中,由于字符串池不在永久代了,intern()
做了一些修改,更方便地利用堆中的对象。字符串存在时和 JDK 1.6一样,但是字符串不存在时不再需要重新创建实例,可以直接指向堆上的实例。