2013-06-25 105 views
8

這是關於'+'運算符返回結果的區別。字符串文字和字符串對象的結果不同。+字符串類中的運算符

String str="ab"; 
String str1="c"; 
String str2 = "ab"+"c"; // Line 3 
String str3 = "abc"; 
String str4 = str+str1; // Line 5 

System.out.println(str2==str3); // True 
System.out.println(str2==str4); // False 

隨着我們可以推斷,從字符串字面池已經可用的對象返回結果爲3線的情況下,用String對象的新對象返回,在第5行爲什麼會這樣?

+0

我比較引用相等在這種情況下。 – Prashant

+0

+1,我也想知道爲什麼,雖然我認爲這是因爲你正在分配文字字符串1-4並在str4中進行串接,但我不確定這是否是另一個原因。 – Thihara

回答

9

+String的操作符根據可以評估表達式的時間進行不同的處理。

如果可以在編譯時評估表達式(如第3行),則編譯器將創建僅包含並置的String。因此,在第3行中只有String「abc」將被創建,而String將被放入.class文件中。因此str3str4將完全相同,並將被實施。

當使用只能在運行時進行評估的級聯(如第5行)時,得到的String是一個新的String,因爲它是一個新對象,所以它必須與equals()進行比較。

3

String str2 = "ab"+"c";這是評估編譯時間。它進入常量池,因爲編譯器已經知道它。

另一個可以在運行時進行評估,它不會是常量池的一部分。

這是需要注意的情況下的差異很好的機會,在您使用String#concat,如果你這樣做

String str2 = "ab".concat("c");

由於字符串是不可變的,一個新的String從concat造成str不被拘留返回。所以在這種情況下,str2 == str3將是false

0

我已經標記爲重複的問題,但發現類似的答案不張貼,所以想到給它一去。其他答案已經指出爲什麼答案是錯誤的。 但是,這是什麼,它會顯示你什麼時候會是真的。

如果您在第二個字符串上調用intern(),那麼結果將是true

爲什麼這有效?

爲了節省內存(並加速測試的相等性),Java支持Strings的「interning」。當在字符串上調用intern()方法時,將在被執行字符串的表上執行查找。如果具有相同內容的String對象已經在表中,則返回表中對字符串的引用。否則,字符串將被添加到表中並返回對其的引用。

String str4 = (str+str1).intern(); 

顯式調用intern()返回到參考實習字符串。

0

當你創建str,str1,str2和str3時,它會指向同一個字符串pool.Here它不會創建字符串對象。 但是,當你將創建字符串str4 = str + str1.So str4在運行時計算。所以不會是所有其他字符串指向相同的字符串池的一部分。所以str4返回false ..

+0

這是不正確的。例如,'str == str1'是'false'。如果它們在編譯時被評估並且具有相同的字符串值,它們將會被執行。 – Maroun