让我们看一下下面的代码片段:
String s1 = "Hello";
String s2 = "Hello";
由于内部变量,这两个变量都指向同一对象。由于字符串是不可变的,因此仅创建一个对象,并且两个对象都引用同一对象。
Aconstant pool
也是东西,它包含在类中声明的所有常量(整数,字符串等)。它特定于每个类。
System.out.println("Hello"); // I believe this Hello is different from above.
问题:
string pool
在常量池中引用常量字符串对象的池?我的问题是
- 字符串池是否引用常量池中的常量字符串对象池?
没有。
“常量池”是指对Java类加载器有意义的类文件中字节的一种特殊格式的集合。其中的“字符串”已序列化,它们不是Java对象。还有很多常量,而不仅仅是字符串。
请参见第4.4章常量池表
Java虚拟机指令不依赖于类,接口,类实例或数组的运行时布局。相反,说明引用
constant_pool
表中的符号信息。
相反,“字符串池”在运行时使用(不只是在类加载期间使用),仅包含字符串,而字符串池中的“字符串”是java对象。“字符串池”是从java.lang.String
实例到java.lang.String
用于内部字符串的实例的线程安全弱映射。
字符串文字是对类实例的引用
String
(第4.3.1节,第4.3.3节)。而且,字符串文字总是引用class的相同实例
String
。这是因为使用方法将字符串文字(或更常见的是作为常量表达式的值的字符串(第15.28节))“插入”以便共享唯一的实例String.intern
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句