JavaGuide
JavaGuide copied to clipboard
常量池问题
感觉对于字符串常量池和运行池的定义有问题
根据 周志明教授在这个issue https://github.com/fenixsoft/jvm_book/issues/112 的讨论
以及jdk源码的注释
所以我觉得,每个class文件都有自己的常量池表,这个是静态的。当class被加载后放到方法去,静态的常量池表就变成运行时常量池(jvm第三版47页),在这期间还可能动态的加入一些静态常量池表以前没有的东西。而针对字符串这种常量,为了节省开销,就统一由String类的运行时常量池管理。而其他每个类自己的运行时常量池,管理自己的符号常量之类的
intern方法时如何使用的:
String s = new String("a"); s.intern();
intern是String自带的一个方法。
JDK6及之前调用intern方法时候如果字符串常量池先创建出该字符串对象,返回池中的该字符串的引用。否则将此字符串对象添加到字符串常量池中,并且返回该字符串对象的引用。
JDK6+:调用intern方法时,如果字符串常量池先前已经创建出该字符串对象,则返回池中的该字符串的引用。否则如果该字符串对象已经存在于Java堆中,则将堆中对此对象的引用添加到字符串常量池中,并且返回该引用;如果堆中不存在则池中创建该字符串并返回其引用。
简单总结一下:JDK6之后不仅在池中加载字符串对象,还会在Java堆中加载一份字符串对象。
引自本人博客:原文链接:https://blog.csdn.net/weixin_44240370/article/details/104065129