字符串池与常量池

Jee*_*evi 20 java string jvm constants

我们来看下面的代码片段:

  String s1 = "Hello";
  String s2 = "Hello"; 
Run Code Online (Sandbox Code Playgroud)

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

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

 System.out.println("Hello");  // I believe this Hello is different from above.
Run Code Online (Sandbox Code Playgroud)

问题:

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

Mik*_*uel 15

我的问题是,

  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.

  • @nanosoft,使用世代垃圾收集器,在[托儿所](https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html#wp1085825)中分配新对象,但实习生字符串通常是长寿的,因此实现可以跳过类加载器分配的字符串的托儿所.JVM是否执行此操作是一个实现决策,并且不是由*Java虚拟机规范*强制实施的.*Java**语言**规范*是Java规范的另一半,但主要是关于内存管理问题的JVM规范. (2认同)