2011-06-16 79 views
3

我们做了下面的String对象?字符串参考?

String str1 = new String("ABC"); 
String str2 = new String("ABC"); 
String str3 = "ABC"; 
String str4 = "ABC"; 

两个问题上面:

  1. system.out.println("valof str1 "+str1); - 它打印str1为ABC 但是,当我们比较if(str1==str2),其字符串对象的refrences进行比较。 jvm如何获得差异?

  2. str1具有不同的充参考从str2str3str3str4具有相同的引用,这样做的JVM检查,如果我们要以平等的运营商(而不是新的)已经存在创建的字符串(如果它存在,它不会创建新对象只是将相同的引用赋值给新变量,即str4),但是在新操作符的情况下它不会执行此确认?

回答

11

在Java中,字符串(裸"ABC"代替new String("ABC"))是实习。也就是说,只有一个副本存储在JVM中,并且始终是使用的副本。这就是为什么他们使用==时比较相等。

以下的比较也总是如此:

str1.intern() == str2.intern() 
str1.intern() == str3 
str2.intern() == str3 
str1.intern() == str4 
str2.intern() == str4 
+0

如果你可以调用s.intern()来实习任何字符串。 – 2011-06-16 18:59:16

+0

@Spike:的确,我更新了我的答案以证明这一点。 (无论如何,我本来打算把它放在首位,但是因为我想在第一篇文章---“西部最快的枪”中发帖---我通常会发布一些基本的东西,然后在5分钟内将其展开期间。) – 2011-06-16 18:59:57

+0

感谢克里斯提供有见地的解释。但是我对你的解释有如下疑问:1)如果我们创建了str1 = new String(“ABC”)// //它现在不会被添加到池中。但是当我们做str1.intern()时,它会在池中添加str1我的point1仍然没有答案,即当我们做如果(str1 == str2)它比较参考,但在打印str1内的sys出它实际上打印值? – 2011-06-17 13:14:57

3

你明确地创建新的字符串,并要求不同的引用,当你调用new String(...)。如果你想回到一个单一的参考,你可以打电话:

str1 = str1.intern();