使用关键字 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将它存储在常量池中,这意味着第一行的文字没有被实现。
答案 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对象不是。