Java 字符串池与常量池
让我们看一下下面的代码片段:Java 字符串池与常量池,java,string,jvm,constants,Java,String,Jvm,Constants,让我们看一下下面的代码片段: String s1 = "Hello"; String s2 = "Hello"; 由于内部原因,两个变量引用同一个对象。因为字符串是不可变的,所以只创建一个对象,并且两个对象都引用同一个对象 常量池也是一种东西,它保存类中声明的所有常量(整数、字符串等)。它是针对每个类的 System.out.println("Hello"); // I believe this Hello is different from above. 问题: string
String s1 = "Hello";
String s2 = "Hello";
由于内部原因,两个变量引用同一个对象。因为字符串是不可变的,所以只创建一个对象,并且两个对象都引用同一个对象
常量池也是一种东西,它保存类中声明的所有常量(整数、字符串等)。它是针对每个类的
System.out.println("Hello"); // I believe this Hello is different from above.
问题:
string pool
是否引用常量池中常量字符串对象的池
如果是,字符串池在整个应用程序中是通用的还是特定于一个类
只有一个字符串池,并且所有字符串文本都会自动插入。
此外,还有其他用于自动装箱等的池
常量池是为类放置这些文本的地方
我的问题是,
字符串池是否引用常量池中常量字符串对象的池
没有
“常量池”是指类文件中的一个特殊格式的字节集合,它对Java类加载器有意义。其中的“字符串”是,它们不是Java对象。还有很多种常量,不仅仅是字符串
看
Java虚拟机指令不依赖于类、接口、类实例或数组的运行时布局。相反,指令引用常量\u池中的符号信息
相反,“字符串池”是在运行时使用的(不仅仅是在类加载期间),只包含字符串,而字符串池中的“字符串”是java对象。
“字符串池”是一个线程安全的弱映射,从java.lang.string
实例到java.lang.string
实例用于插入字符串
说
字符串文字是对类string
(§4.3.1,§4.3.3)实例的引用
此外,字符串文字总是指类string
的相同的实例。这是因为使用方法string.intern
,字符串文字(或者更一般地说,是常量表达式(§15.28)的值的字符串)被“插入”以共享唯一实例
此字符串池存储位置的可能重复项?As-link声称,插入的字符串存储在堆中。那么,它是与其他对象所在的堆相同还是不同?任何指向javadocs或java规范的链接都会受到欢迎。@nanosoft有一个分代垃圾收集器,可以在中分配新对象,但插入的字符串通常是长期存在的,因此实现可以跳过由类装入器分配的字符串的托儿所。JVM是否这样做是一个实现决策,而不是Java虚拟机规范所要求的。Java语言规范是Java规范的另一半,但在内存管理问题上主要委托给JVM规范?JVM规范中没有任何信息可以证明这一点。你是怎么发现的?您能提供一些openjdk源代码的参考资料或任何其他官方参考资料来证明这一点吗?