2

字符串池可以包含两个具有相同值的字符串吗?

String str = "abc";
String str1 = new String("abc");

   Will the second statement with `new()` operator creates two objects of `string` "abc", one on `heap` and another on `string` pool? 

   Now if i call intern() on str1 ie str1.intern(); as a third statement, will str1 refer to the "abc" from String pool? 

  If yes then what will happen to the object that was created on heap earlier by the new(). Will that object be eligible for garbage collection.?
  If no then what will be the result of str1.intern();?
4

5 回答 5

7

没有第一个也将创建一个对象,第二个也将只创建一个字符串对象。区别在于第一个将在字符串池中创建,第二个将仅在堆中创建。如果你会调用str1.intern(); 然后它将被添加到字符串池中。

String str1 = "abc";
String str2 = new String("abc");
Stirng str3 = "abc"

这里将创建两个对象。第一行将创建一个引用 str1 的强对象,第三行将指向在第一行创建的引用 str3 的同一对象,但在第二行将创建一个新对象,因为我们在new这里使用关键字。希望它会帮助你。

还要检查这个答案。那里有很好的解释。

于 2013-07-31T10:25:36.967 回答
1
    String t1 = "ABC";
    String t2 = new String("ABC");
    String t3 = "ABC";

    System.out.println(t1 == t2);
    System.out.println(t2 == t3);
    System.out.println(t1 == t3);

生成以下输出(Java SE 7):

    false
    false
    true
于 2013-07-31T10:46:13.033 回答
1

“abc”对象将在类加载时创建并放在字符串池中。第二行将使用 String(String original) 构造函数,其中 original 是指向池中“abc”的指针。这是第二行的字节码:

NEW java/lang/String
DUP
LDC "abc"
INVOKESPECIAL java/lang/String.<init>(Ljava/lang/String;)V
ASTORE 2
于 2013-07-31T10:37:07.137 回答
1

new String("abc")是一个类实例创建表达式,并且必须创建一个新对象。它是否在内部与文字 "abc" 共享相同的 char 数组取决于 String 实现。两个“abc”引用都将使用相同的实习生字符串。

于 2013-07-31T10:37:29.793 回答
0

基本上是:

// "abc" is interned by the JVM in the pool
String str="abc"; 
// JVM uses the pooled "abc" to create a new instance
String str1=new String("abc"); 

String仅创建一个由 引用的新对象str1String文字被"abc"JVM 保留。由于字面"abc"量已经存在于字符串池中,在第二个语句中,JVM 应该使用它。

于 2013-07-31T10:26:41.540 回答