“Hello”将存储在String Constant Pool或Heap中的位置?

时间:2015-08-19 13:35:04

标签: java string

我们知道Java程序中的所有字符串文字,例如“abc”,都是作为String类的实例实现的,所有这些都转到String Constant Pool。 我的问题是:“Hello”文字将存储在下面的案例中?

String str=new String("Hello");

如果这个文字将转到“String Constant Pool”,那么intern方法会做什么?

3 个答案:

答案 0 :(得分:1)

代码中的字符串文字直接转到Sring池。在它们上调用intern()将不执行任何操作。 intern()仅在您正在构建字符串的情况下才有意义(在运行时,而不是编译时)。在那些情况下,调用intern()将指示JVM将此变量移动到String池中以供将来使用。

答案 1 :(得分:0)

它将存储到Heap中。如果您将使用实习方法,那么它将被推送到字符串池。

public static void main(String[] args) {
    String strLiteral="Hello";
    String str=new String("Hello");
    System.out.println(str==strLiteral);

    String str2=new String("Hello").intern();
    System.out.println(str2==strLiteral);

}



Output:-
   false
   true

1)看看上面的代码,我创建了一个String Literal Hello,它存储在String Pool中 2)现在我创建了一个String对象str,如果我检查引用str和strLiteral它们是不相等的,即它们指向堆中的两个不同对象和String池中的另一个对象。
3)现在我已经创建了一个String对象str2并在其上调用了一个实习方法,JVM现在将搜索" Hello"在String池中并返回对它的引用。所以现在如果我检查strLiteral和str2是相等的,即指向String池中的同一个对象。

答案 2 :(得分:0)

 String str=new String("Hello");

在这种情况下,JVM将在普通(非池)堆内存中创建一个新的字符串对象,文字“Hello”将放在字符串常量池中。变量str将引用堆中的对象(非池)。