2009-10-11 100 views
12

在編寫自己的課程時,是否需要覆蓋equals(Object o)我們應該總是重寫equals嗎?

如果我不這樣做,它會自動檢查所有的字段是否相同?或者它只是檢查兩個變量是否指向同一個對象?

回答

16

如果有人正在編寫一個將以某種方式比較其對象的類,那麼應該覆蓋equalshashCode方法。

不提供顯式equals方法將導致繼承從超類的equals方法的行爲,以及在超類是所述Object類的情況下,那麼這將是該行爲在用於在Java API規範setforth Object類。

用於提供equals方法一般合同可以在文檔中找到的Object類,具體而言,的equalshashCode方法的文檔。

4

Object類的equals方法實現對象上最可能的等價關係;也就是說,對於任何非空引用值x和y,當且僅當x和y引用同一對象(x == y的值爲true)時,此方法返回true。

爲了測試兩個對象在等價意義上是否相等(包含相同的信息),您必須重寫equals()方法。如果身份運算符不適合您,則應始終覆蓋equals()方法類。

請注意,無論何時重寫此方法,通常都需要重寫hashCode方法,以便維護hashCode方法的一般約定,該方法聲明相等對象必須具有相同的哈希代碼。

5

如果有意義,只能覆蓋equals()。但很明顯,如果您覆蓋equals(),則需要確保hashcode()合同沒有中斷,這意味着如果兩個對象相同,它們必須具有相同的散列碼。

它什麼時候有意義?當Object.equals()不足時。該方法基本上可以歸結爲參考身份,這意味着兩個對象是相同的對象,以便:

數字是一個明顯的例子,當它是有意義的,因爲Integer(10)應等於另一個Intger(10)

另一個示例可能是您代表數據庫記錄時。假設您的學生記錄具有唯一的整數ID,那麼可能是就足夠執行等於只是比較ID字段。

2

雖然不應該依賴IDE,但Eclipse通過按alt + shift + s並選擇equals和hashCode菜單選項來提供此功能。還有一個toString選項。由Josh Bloch提供的Effective Java有關於此主題的更多信息。該鏈接會將您帶到討論此主題的Google圖書上的章節。

相關問題