2014-11-01 50 views
2

在我們繼續前進: 我知道我們應該使用.equals()來比較內容。我現在只是在談論如果實際的參考是以下情形一樣...字符串比較困惑

假設我們有以下幾點:

String str1 = "str"; 
String str2 = "string"; 
String str3 = "ing"; 
String str4 = str1 + str3; 
str1 = str4; 
String str5 = "string"; 
System.out.println(str1==str2);//false 

我認爲這應該是真實的,因爲在字符串池,對「字符串」的引用應該是相同的,因爲str1和str2現在都是「字符串」。這應該是真的,但最終結果爲false

System.out.println(str1.intern()==str2.intern());//true 

我嘗試這樣做,它返回一個真正這個時候。 然後我嘗試:

System.out.println(str1==str5);//false 
System.out.println(str2==str5);//true 

而且 的System.out.println( 「STR」 + 「ing」 的== 「字符串」); //真

是不應該來從字符串池? 有人可以幫忙解釋一下嗎?

+0

'System.out.println(str1.intern()== str2.intern());'不應該返回true ...文本是不同的。 – Pokechu22 2014-11-01 21:22:32

+1

'String'是'final',這意味着它是不可變的。改變文字,創建一個新的對象。 – 2014-11-01 21:22:38

+0

可能的重複[是不錯的做法使用java.lang.String.intern()?](http://stackoverflow.com/questions/1091045/is-it-good-practice-to-use-java-lang -string-intern) – kraskevich 2014-11-01 21:22:55

回答

6

只有字符串文字和常量表達式保證彙集。由於str1 + str2不是文字,因此無論結果是否被執行都取決於JVM。你可以通過調用intern()來強制它,因爲你已經發現了。

這在§ 3.10.5 of the Java Language Specification定義:

字符串文字是String類的實例的引用(第4.3.1節,§4.3.3)。

此外,字符串常量指的是類String的同一個實例。這是因爲使用方法String.intern將字符串文字(或更一般地說是常量表達式的值(§15.28))的字符串「interned」以共享唯一實例。

你的第二個例子,"str" + "ing",是一個常量表達式,所以它是保證被實施的。請參閱the JavaDoc for String.intern

這是試圖解釋發生了什麼。寫得好的代碼應該不會依賴於此,但始終使用equals方法。任何合理的JRE會像

if (this == other) 
    return true; 

非常接近String.equals所以性能明智的,它不應該的問題上進行檢查。

+0

我認爲這是答案,但你有任何來源支持這一點 – 2014-11-01 21:26:32

+0

感謝你。我瞭解使用.equals()。我只想弄清楚這種情況下的參考問題。 – 2014-11-01 21:28:42

0

總是使用equals方法比較字符串。實習生的麻煩在於每個版本的JDK都會有所不同,所以我不會指望這一點,除非你想每次都在實習生中調用實習生。