2013-07-31 46 views
1

字符串池是否包含两个具有相同值的字符串?字符串池是否包含两个具有相同值的字符串?

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();? 
+0

阅读本:HTTP://stackoverflow.com/questions/17489250/how-can-a-string-be-initialized-使用/ 17489410#17489410 –

回答

6

没有第一个也会创建一个对象,第二个也只会创建一个字符串对象。不同之处在于,第一个将在字符串池中创建,第二个将仅在堆中创建。 如果您打电话给str1.intern();然后它将被添加到字符串池。

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

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

另请检查this的答案。好的解释就在那里。

+0

所以,你的意思是说如果我按照相反的顺序执行语句,仍然会有两个对象? –

+2

@JunedAhsan无论你在那里做什么,只会有两个对象。我编辑了一点我的答案。 Plz再次阅读。 –

+0

不,这是错的。如果你用new创建一个对象,它仍然是字符串池的一部分。如果后面跟着一个简单的string =“sameStirng”语句,则会使用池中的对象,而不是创建新的对象。 –

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对象被创建由str1引用。 String文字​​由JVM实施。由于文字​​已经存在于字符串池中,所以在第二个语句中,JVM应该使用它。

+1

'// JVM使用池中的“abc”创建一个新的实例' - JVM首先检查池中的文字,如果存在,那么使用该JVM在堆中创建字符串? – exexzian

+0

@sansix这种说法与我的不同之处在哪里? – NINCOMPOOP

+0

我没有downvoted你 - 我只是有疑问 - 'JVM应该使用'文字池值或'使用'值 – exexzian

0

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

NEW java/lang/String 
DUP 
LDC "abc" 
INVOKESPECIAL java/lang/String.<init>(Ljava/lang/String;)V 
ASTORE 2 
1

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

+0

文档说“新创建的字符串是参数字符串的副本”。这听起来像没有'char []'共享应该被允许发生(尽管不是100%明确的)。 –

+0

@MarkoTopolnik在文档中没有提及或需要使用char [],所以“副本”评论不太可能适用于它,而不是String参数。实际上,只有在String参数比它的数组短的情况下,JDK 1.7实现才会复制数组。这可能是子字符串操作的结果。 –

+0

是的,这就是为什么我说它不是100%明确的,但请注意:它不会说“新创建的字符串”,而是“新创建的字符串”。实际的字符串存储在'char []'中。 –

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); 

产生如下的输出(爪哇SE 7):

false 
    false 
    true 
相关问题