让我们看一下以下代码段:
String s1 = "Hello";
String s2 = "Hello";
由于实习,两个变量都引用同一个对象。由于字符串是不可变的,因此只创建一个对象并且它们都引用同一个对象。
constant pool
也是一种东西,它包含在类中声明的所有常量(整数,字符串等)。它是针对每个班级的。
System.out.println("Hello"); // I believe this Hello is different from above.
问题:
string pool
是否引用常量池中常量字符串对象的池?答案 0 :(得分:15)
我的问题是,
- 字符串池是指常量池中常量字符串对象的池吗?
醇>
没有
“常量池”是指类文件中特殊格式的字节集合,对Java类加载器有意义。其中的“字符串”是serialized,它们不是Java对象。还有很多种常量,而不仅仅是字符串。
请参阅Chapter 4.4 the constant pool table
Java虚拟机指令不依赖于类,接口,类实例或数组的运行时布局。相反,指令引用
constant_pool
表中的符号信息。
相反,“字符串池”在运行时使用(不仅仅在类加载期间),仅包含字符串,字符串池中的“字符串”是java对象。
“字符串池”是从用于实习字符串的java.lang.String
个实例到java.lang.String
个实例的线程安全弱映射。
Chapter 3.10.5. String Literals说
字符串文字是对类
String
的实例的引用(§4.3.1,§4.3.3)。此外,字符串文字始终引用类
String
的相同实例。这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被“实现”以便使用方法String.intern
共享唯一实例。
答案 1 :(得分:3)
只有一个字符串池,所有字符串文字都会自动实现 此外,还有其他自动装箱池等。
常量池是为类提供这些文字的地方。