字符串池与常量池

时间:2014-04-23 18:46:56

标签: java string jvm constants

让我们看一下以下代码段:

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

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

constant pool也是一种东西,它包含在类中声明的所有常量(整数,字符串等)。它是针对每个班级的。

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

问题:

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

2 个答案:

答案 0 :(得分:15)

  

我的问题是,

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

没有

“常量池”是指类文件中特殊格式的字节集合,对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)

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

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