让我们看看下面的代码片段:
String s1 = "Hello";
String s2 = "Hello";
两个变量引用同一个对象,因为字符串是不可变的,所以只创建一个对象,并且两个变量引用同一个对象。
一个constant pool
也是一个东西,它保存了类中声明的所有常量(整型、字符串等),它是特定于每个类的。
System.out.println("Hello"); // I believe this Hello is different from above.
- 问题:**
string pool
是否引用常量池中常量字符串对象的池?
1.如果是,* 字符串池 * 是整个应用程序中的公共池,还是特定于某个类?
3条答案
按热度按时间bcs8qyzn1#
我的问题是,
1.字符串池是指常量池中常量字符串对象的池吗?
没有。
“常量池”是指类文件中对Java类加载器有意义的特殊格式的字节集合,其中的“字符串”是serialized,它们不是Java对象,常量的种类也很多,而不仅仅是字符串。
见第4.4章常量池表
Java虚拟机指令不依赖于类、接口、类示例或数组的运行时布局,而是引用
constant_pool
表中的符号信息。相反,“字符串池”是在运行时使用的(而不仅仅是在类加载期间),只包含字符串,字符串池中的“字符串”是java对象,“字符串池”是从
java.lang.String
示例到java.lang.String
示例的线程安全弱Map,用于实习字符串。第3.10.5章字符串字面量表示
字符串字面量是对类
String
的示例的引用(参见4.3.1节)。此外,字符串常量总是引用类
String
的同一个示例,这是因为字符串常量--或者更一般地说,常量表达式的值(参见15.28节)--是被“interned”的,以便共享唯一的示例,使用的是String.intern
方法。rks48beu2#
只有一个字符串池,并且所有字符串字面值都被自动暂存。
此外,还有其他用于自动装箱等的池。
常量池是为类放置这些文本的地方。
euoag5mw3#
constans_pool(所有constans,包括String)是类文件中的一个数据结构(在JVM之外),当类文件加载到JVM中时,constans_pool-〉run-time constans_pool(General),在hotspot & SE8: