2011-06-16 78 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();