2016-03-03 186 views
-1
String s1 = "abc"; 
String s2 = "abc"; 
String s3 = new String("abc"); 
String s4 = new String("abc"); 

if (s1 == s2) is giving true 

while (s3 == s4) is giving false. 

有人可以詳細解釋什麼是String什麼是池,堆,每行中創建了多少個對象以及總共創建了多少個對象。Java字符串混淆

爲什麼s3==s4正在給false

詳細解釋將不勝感激。

+1

因爲你沒有以正確的方式比較它們。 http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java –

+0

請參閱此問題http://stackoverflow.com/questions/2486191/what-is-the-java-string -pool-and-how-is-s-different-from-new-strings –

+0

字符串應該使用Java中的equals()方法進行比較。但是,是的,你的問題是關於'字符串池'。 – mzy

回答

0

當你做new String(...)時,它會在運行時進行評估並因此創建兩個不同的實例,最終得到s3 == s4false。當您使用StringBuilder並執行諸如sb.toString()之類的事情時,會發生同樣的事情,該事件將在運行時再次進行評估。

例如

StringBuilder sb = new StringBuilder(); 
String foo = sb.append("abc").toString(); 

String bar = new String("abc"); 

String foobar = "abc"; 

foo這裏,barfoobar都是不同的對象,因此foo == barfoo == foobar將評估爲false

在另一方面s1 == s2回報true因爲abc一個聲明,已經存在的字符串池,在這種情況下,兩個對象指向池相同的參考。

+0

爲什麼這是低票?這個答案有什麼不對? – user2004685

+1

我還沒有投票,但我可以理解downvotes。重複這個答案多次是沒有意義的。這個新手問題每月會被問幾次,所以把這個問題標記爲重複,而不是寫一個答案要好得多。那麼,我們可以考慮減少研究OP的問題。 – Tom

+1

@Tom感謝您的回覆。我明白你的觀點。 – user2004685

-1

java中的String類是在java.lang包中定義的,它正是而不是像int或boolean這樣的原語。

字符串的開發,以提供與衆多人物ANS操作中,幾乎所有的Java應用程序

關於Java和字符串一些有趣的事實是commmonly使用:

字符串中的不可變的,最後在Java中,在這種情況下, JVM使用字符串池來存儲所有的String對象。

什麼是不同的方式來創建字符串對象?

我們可以使用新運算符創建String對象,就像任何普通的java類一樣,或者我們可以使用雙引號(文字賦值)來創建一個String對象。

有在String類可從字符數組,字節數組,StringBuffer的和StringBuilderetc等

你的問題得到字符串太幾個構造函數:

當我們使用雙引號創建一個字符串,JVM在字符串池中查找是否有其他字符串以相同的值存儲。如果找到,它只是返回對該String對象的引用,否則它會創建一個具有給定值的新String對象並將其存儲在String池中。

當我們使用new運算符時,JVM將創建String對象,但不會將其存儲到String Pool中。我們可以使用intern()方法將String對象存儲到String池中,或者如果池中已存在一個具有相等值的String,則返回引用。

所以,當你做

String s1 = "abc"; 
String s2 = "abc"; 

那些在StringPool檢查,因爲S1已經存在那裏,S2將採取相同的參考,因此,S1 S2 ==是真實的。

但是當你這樣做:

String s3 = new String("abc"); 
String s4 = new String("abc"); 
您使用的是新的運營商

,所以JVM不檢查,如果有一個字符串已在堆中,它只是分配一個空間對於s4,s3 == s4也是如此當然不。

請查看下面的圖片以獲取更多說明示例。

enter image description here