2013-07-09 48 views
2

比較下面的代碼的輸出是false字符串和整數與equals

String str = "3456"; 
String str1 = "3456"; 
System.out.println(Integer.valueOf(str).equals(str1)); 

我不明白。我認爲它會返回true。當我正在爲SCJP做準備時,瞭解其背後的原因可能會有所幫助。有人可以幫忙嗎?

+2

爲什麼要相等?一個是Integer對象,另一個是String對象。這是一個很大的區別......一個代表一個數字值,另一個代表一個字符序列。 – jlordo

回答

11

一個Integer將永遠不會equalString

這兩個類都有非常嚴格的equals()定義,只有接受它們各自類型的對象。

  • Integer.equals()

    結果爲true當且僅當該參數不是nullInteger對象包含相同int值作爲該對象。

  • String.equals()

    結果爲true當且僅當該參數不是nullString對象表示相同的字符序列作爲該對象。

這實際上是實現equals()很常見的方式:只有同一個類的對象(偶爾子類)可以是相等的。其他的實現是可能的,但是是例外。

一個常見的例外是集合such as List:下面的慣例相比,當任何其他實現,如果它在相同的順序相同的內容將返回trueList實施。

+0

哦好吧..我現在得到它..但不應該寫在這樣的方式,以便給編譯時錯誤在這種情況下? – Anand

+0

@Anand:不,這就是爲什麼'equals()'是'Object'的一種方法:你可以*詢問*兩個對象是否相等,無論是哪種類型。 –

+0

但如果類型不同,它不會起作用,即將始終返回假 – Anand

1

了equals()方法的國家(除其他事項外),其是對象進行比較的需要是同一類的一般合同。這就是爲什麼你永遠無法比較蘋果和橘子。

有關equals()方法的完整合同,請參閱javadocs。

2

通常,實施equals()時,第一要做的事情之一是檢查對象是否是同一個類型的。

public boolean equals(Object obj) { 
    if (!(obj instanceof SomeType)) return false; 
    ... 
} 

這也是在IntegerString類,解答了爲什麼你收到false結果的問題上。

0

一個Integer對象不能與String對象等於

使用:

boolean a = str.equals(str1); 

OR

boolean a = (Integer.parseInt(str) == Integer.parseInt(str1)); 
+0

哪種更好? – barq