Java 字符串池能否包含两个值相同的字符串?

Java 字符串池能否包含两个值相同的字符串?,java,string,Java,String,字符串池能否包含两个具有相同值的字符串 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 str

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

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

第一个对象也不会创建一个对象,第二个对象只会创建一个字符串对象。区别在于第一个将在字符串池中创建,第二个将仅在堆中创建。 如果您要调用str1.intern()然后将其添加到字符串池中

String str1 = "abc";
String str2 = new String("abc");
Stirng str3 = "abc"
这里将创建两个对象。第一行将创建一个带有参考str1的强对象,第三行将指向在第一行中创建的带有参考str3的相同对象,但在第二行中,将创建一个新对象,因为我们在此处使用
new
关键字。希望它能帮助你

同时检查答案。有很好的解释。

基本上是:

// "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
引用。JVM将
字符串
文本
“abc”
作为实习生。由于字符串池中已经存在文本“abc”
,因此在第二条语句中,JVM应该使用它。

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

NEW java/lang/String
DUP
LDC "abc"
INVOKESPECIAL java/lang/String.<init>(Ljava/lang/String;)V
ASTORE 2
newjava/lang/String
重复
最不发达国家“abc”
调用特殊的java/lang/String。(Ljava/lang/String;)V
阿斯托尔2号
新字符串(“abc”)
是一个类实例创建表达式,必须创建一个新对象。它是否在内部与文本“abc”共享相同的字符数组取决于字符串实现。两个“abc”引用将使用相同的intern字符串

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


读这个:你的意思是说如果我按相反的顺序做这些陈述,仍然会有两个对象?@JunedAhsan无论你做什么,都只会有两个对象。我编辑了我的答案。请再读一遍。不,这是错的。如果使用new创建对象,它仍然是字符串池的一部分。如果后跟一个简单的string=“sameStirng”语句,则将使用池对象,而不是创建一个新对象。否如果在任何情况下使用new,则将创建一个新对象,即使字符串池中存在另一个具有相同值的字符串。我来编辑一下答案。谁给我解释一下<代码>//JVM使用池中的“abc”要创建一个新实例
-JVM首先检查池中的文本,如果存在,然后使用该JVM在堆中创建字符串?@sansix该语句与我的有什么不同?我没有否决你-我只是怀疑-
JVM应该使用
该文本池值或
使用
该值value@TheNewIdiot嘿,我想知道一切这些你怎么知道sureshatta否决了你?这是知道谁否决了你的方法吗?如果是,我们还可以知道其他类似的功能吗?String str=“abc”;字符串str1=新字符串(“abc”);现在如果我在str1上调用intern(),即str1.intern();作为第三条语句,它将引用字符串池中的“abc”。那么new()先前在堆上创建的对象会发生什么情况。该对象是否有资格进行垃圾收集?文档中说“新创建的字符串是参数字符串的副本”。这听起来像是不允许出现任何
char[]
共享(即使不是100%明确)。@MarkoTopolnik文档中没有提到或要求使用char[],因此“copy of”注释不太可能应用于它,而不是字符串参数。在实践中,JDK1.7实现在且仅当字符串参数比其数组短时生成数组的副本。这可能是子字符串操作的结果。是的,这就是为什么我说它不是100%显式的,但请注意:它不是说“一个新创建的
字符串”,而是说“一个新创建的字符串”。实际字符串存储在
char[]
中。
    false
    false
    true