字符串池与常量池

2022-09-01 23:35:26

让我们看一下 folloing 代码片段:

  String s1 = "Hello";
  String s2 = "Hello"; 

由于实习,这两个变量都引用同一对象。由于字符串是不可变的,因此仅创建一个对象,并且两者都引用同一对象。

A 也是某种东西,它包含类中声明的所有常量(整数、字符串等)。它特定于每个类。constant pool

 System.out.println("Hello");  // I believe this Hello is different from above.

问题:

  1. 是否引用常量池中常量字符串对象的池?string pool
  2. 如果是,字符串池是在整个应用程序中通用的还是特定于类的?

答案 1

我的问题是,

  1. 字符串池是否是指常量池中的常量字符串对象池?

哈哈

“常量池”是指类文件中对 Java 类装入器有意义的特殊格式的字节集合。其中的“字符串”是序列化的,它们不是Java对象。还有很多种类的常量,而不仅仅是其中的字符串。

参见第 4.4 章常数池表

Java 虚拟机指令不依赖于类、接口、类实例或数组的运行时布局。相反,指令引用表中的符号信息。constant_pool

相比之下,“字符串池”在运行时使用(不仅仅是在类加载期间),只包含字符串,字符串池中的“字符串”是java对象。“字符串池”是从实例到用于插入字符串的实例的线程安全弱映射。java.lang.Stringjava.lang.String

第 3.10.5 章。字符串文本

字符串文本是对类的实例的引用 (§4.3.1, §4.3.3)。String

此外,字符串文本始终引用类 的同一实例。这是因为字符串文本 (或者更一般地说,作为常量表达式的值的字符串 (§15.28) ) 被“暂存”,以便使用该方法共享唯一实例。StringString.intern


答案 2

只有一个字符串池,并且所有字符串文本都将自动暂存。
此外,还有其他用于自动装箱等的池。

常量池是为类放置这些文本的位置。