我在 javaranch 网站上读到《 SCJP 提示热线》的作者 Corey McGlone 的文章后感到非常困惑。命名为字符串,字面上和 SCJP Java6程序员指南作者: Kathy Sierra (javaranch 的联合创始人)和 Bert Bates。
我将尝试引用 Corey 先生和 Kathy Sierra 女士引用的关于 String Literal Pool 的话。
据科里 · 麦克格隆先生说:
字符串文字池是指向字符串对象的引用的集合。
String s = "Hello";
(假设堆中没有名为“ Hello”的对象) ,
将在堆上创建一个 String 对象 "Hello"
,并在 String Literal Pool (Constant Table)
String a = new String("Bye");
(假设堆上没有名为“掰”的对象,new
操作符将强制 JVM 在堆上创建一个对象。
现在,关于 "new"
操作符创建 String 及其引用的解释在本文中有些混乱,因此我将代码和
来自文章本身的解释如下。
public class ImmutableStrings
{
public static void main(String[] args)
{
String one = "someString";
String two = new String("someString");
System.out.println(one.equals(two));
System.out.println(one == two);
}
}
在这种情况下,由于关键字 "new."
,我们实际上得到了稍微不同的行为
在这种情况下,对两个字符串文字的引用仍然放在常量表(字符串文字池)中,
但是,当使用关键字 "new,"
时,JVM 必须在运行时创建一个新的 String 对象,
而不是使用常量表中的那个。
这是解释它的图表. 。
那么这是否意味着,字符串文字池也有一个对这个对象的引用呢?
这里是 Corey McGlone 的文章链接
Http://www.javaranch.com/journal/200409/journal200409.jsp#a1
凯西 · 塞拉和伯特 · 贝茨在 SCJP 的书中写道:
为了提高 Java 的内存使用效率,JVM 在编译器执行任务时留出了一个特殊的内存区域,称为“字符串常量池” 遇到一个字符串文字,它检查池,看看是否有一个相同的字符串已经存在或不存在。如果不是,那么它将创建一个 新的字符串文字对象。
创建一个 String 对象和一个引用变量... 。
没关系,但我被这句话搞糊涂了:
创建两个对象和一个引用变量。
书上说..。在普通(非池)内存中创建一个新的 String 对象,并且“ s”将引用它... 而 将在池中放置一个额外的文字“ abc”。
书中的以上几行与 Corey McGlone 文章中的一行相冲突。
如果 String Literal Pool 是 Corey McGlone 提到的对 String 对象的引用的集合,那么为什么要将文本对象“ abc”放入池中(正如书中提到的) ?
这个字符串文字池驻留在哪里?
请清除这个疑问,虽然在编写代码时它不会太重要,但是从内存管理的角度来看是非常重要的,并且 这就是为什么我想清理这个基金。