Java字符串创建和字符串池

时间:2014-07-16 11:27:12

标签: java string

使用关键字 new 创建String时,它会使用带有字符串文字的构造函数创建一个新的String对象。

在调用String构造函数之前,文字是否存储在常量池中?

String hello = new String("Hello");
String literal = "Hello";             //Does "Hello" already exist in the pool
                                      //or is it inserted at this line?

修改

在OCA Java SE 7程序员I认证指南"中,Mala Gupta写道:

public static void main(String[] args)
{
    String summer  = new String("Summer");   // The code creates a new String object with the value "Summer". This object is not placed in the String constant pool.
    String summer2 = "Summer"                // The code creates a new String object with the value "Summer" and places it in the String constant pool.
}

她在第一行说, new 创建的String对象没有存储在常量池中。这很好,但不清楚的是文字"夏天"在第一行的构造函数中是。 在第二行,她说"夏天"到summer2将它存储在常量池中,这意味着第一行的文字没有被实现。

3 个答案:

答案 0 :(得分:5)

无论您在何处使用,所有字符串文字都保存在String池中。所以答案是肯定的。

String hello = new String("Hello");
                        >--------<  goes to pool.

但问题是h2不会引用h

答案 1 :(得分:1)

在代码中编写"Hello"时,将在编译期间创建此String。 实际上它已经存在,因为你也用它来创建你的new String("Hello"); 其中包含"Hello"。 结论:是的。

答案 2 :(得分:0)

String ob1 = new String("Hello");
String ob2 = "Hello"; 

第一行首先在String Pool中寻找"Hello" string,如果它在那里它在Heap中创建相同,我们的ob1引用该堆对象。如果它不在那里它也在Pool中创建相同,在这种情况下,ob1也指向堆对象。 如果找到的ob2将引用该池对象,则第二行也会在池中寻找"Hello" object。如果未找到,则仅在池中创建,ob2将引用该池对象。 但第二行永远不会在堆中创建一个String对象。保存在String Pool中的字符串对象是可重用的,但在堆中创建的String对象不是。