字符串池与常量池

这个问题可能很愚蠢。 但我完全糊涂了。 需要帮助理解字符串池和常量池。 我很清楚字符串实习和字符串池。

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

现在两者都由于实习而引用同一个对象。(即)由于字符串是不可变的,因此只创建一个对象并且两者都引用同一个对象。

而且常量池是保存在类中声明的所有常量(整数,字符串等)的东西。 它针对每个class级。

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

我的问题是,

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

谢谢。

我的问题是,

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

没有。

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

请参见第4.4章常量池表

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

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

第3.10.5章。 String Literals说

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

此外,字符串文字始终引用类String相同实例。 这是因为字符串文字 – 或者更常见的是作为常量表达式(第15.28节)的值的字符串 – 被“实例化”以便使用String.intern方法共享唯一实例。

只有一个字符串池,所有字符串文字都会自动实现。
此外,还有其他自动装箱池等。

常量池是为类提供这些文字的地方。