2013-01-08 55 views
2

可能重複:
String comparison and String interning in Java差異字符串比較結果B/W ==和串#用==替代

我有一個關於Java中的字符串比較小疑問,考慮以下代碼:

if("String".replace('t','T') == "String".replace('t','T')) { 
    System.out.println("true"); 
} 
else { 
    System.out.println("false"); 
} 

上面的代碼總是打印的false,其中就好像我嘗試像這樣:

if("STring" == "STring") { 
    System.out.println("true"); 
} 
else { 
    System.out.println("false"); 
} 

它會一直打印我true。是的,我知道字符串比較應該用String.equals() or equalsIgnoreCase()方法完成。但這是面試中問的一個問題,我很困惑。任何人都可以指導我這種行爲?

據我所知,在代碼片段1中,"String.replace('t','T')是返回對象,因此對象比較返回false。我對嗎?

回答

5

「與string.replace(‘T’,‘T’)兩個字符串常量被返回對象,所以對象比較 返回false。對嗎?

是的,至於這種情況,你是對的。String#replace(或任何String類的方法),將返回一個新的String對象(你可以猜測爲什麼?不變性)。因此,您必須使用equals方法進行比較,以比較其內容。

現在,在第二種情況: -

"STring" == "STring" 

你比較兩個字符串文字。現在,由於String literals are interned在Java中,所以無論是文字是一樣的(在這個意義上,它們指向同一個內存位置),因此==比較給你true。使用==equals

的差相比較的是,在==基準值進行比較 - 對象的存儲器位置,這將是對於兩個不同的字符串對象不同,因爲你是在第一種情況下具有即值。而equals比較這些對象中的實際內容。

+0

感謝羅希特耆那教,我說在接受採訪時一樣的,我的假設是正確的.. :) –

+0

@PradeepSimha ..不客氣: )那麼,採訪者的回答是什麼?當然他肯定說過什麼嗎? –

+0

沒什麼,只是他說「OK」..:D –

4

「與string.replace( 'T', 'T')將返回對象,因此對象比較假 返回。我說得對不對?

是,==比較對象引用,和你第一代碼是在比較兩個不同的對象。

至於第二代碼而言其由於string interning.

+0

請通讀本文,http://javadude.com/articles/passbyvalue.htm。這甚至會成爲整個問題的答案。沒有通過引用傳遞 – SomeJavaGuy

-1

DO這樣

("String".replace('t','T').Tostring() == ("String".replace('t','T')).ToString() 

這將解決您的問題,因爲替換語句應該在轉換之前轉換爲字符串。

您也可以使用String.Equals爲這個或更好的你使用忽略大小寫,如你在你的問題中提到的。

-1

試試這個:

如果(string1.equals(字符串2)){

...

}

+0

是的,但我的疑問是「爲什麼它返回false」 –

0

的Java總是比較基本類型(intbyte等)或參考用於使用==時的對象。

Java編譯器優化您輸入使用相同的對象,因此,相同的參考,因此,==返回真

1

確定可以像這樣做,你的這兩個字符串對象「串」被referering同一個對象。 所以他們是「基本」平等。這是編譯器爲你做的一件事

但是該方法替換,創建並返回一個新的String對象,這就是爲什麼你的第二個代碼是不相等的。