2010-10-12 93 views
0

可能重複:
Overriding equals and hashCode in Java忽略equals()和hashCode()在Java中

所有,

我定義我的類和重寫equals()和hashCode()方法也是如此。但我不知道這些方法應該爲我自己的班級實施具體的方法。任何人都可以談談這些自定義類的實現嗎?

+0

這實際上取決於您如何定義相等性。通常所有或幾乎所有的屬性都需要考慮,有時候只有一個/幾個,有時候(比如想到線程),你所需要的equals()方法就是比較身份。 – helpermethod 2010-10-12 22:17:12

回答

9

你說你已經知道了,你的自定義類的一個需要重寫的hashCode /等於一個測試?然後你也知道哪些屬性(全局變量)決定了每個類的相等性。當你知道這些屬性時,你可以手動實現hashCode/equals,也可以通過使用諸如Eclipse,NetBeans等現代IDE來生成方法。在Eclipse中有一個名爲「Generate hashCode()and equals()」的選項。在「來源」菜單下

alt text

2
+0

此答案是指向返回503頁的IBM頁面的鏈接。你認爲你可以更新你的答案,包括相關信息,而不僅僅是一個鏈接? – 2014-08-11 11:19:05

+0

@MichaelT這個鏈接仍然是活動的...... – 2014-08-13 04:44:08

3

對於平等,答案取決於你的業務需求是什麼,也就是這是什麼意思你的對象是平等的。

hashCode()應該總是返回一個對象的唯一值,除非該對象等於另一個對象。它應該取決於對象上屬性的值。

+1

最重要的是,hashCode()必須*不*返回true的對象返回不同的值 – 2010-10-12 21:58:26

+0

@michael好點,編輯答案.. – hvgotcodes 2010-10-12 21:59:21

+0

它不能總是返回一個獨特的價值。最簡單的方法是依賴與equals相同的屬性。 – Ishtar 2010-10-12 22:07:11

2

基本上,如果你想存儲的對象集合(地圖,設置,列表)中,然後你必須實現根據文檔中定義的合同equals和hashCode方法。

否則,許多集合實現將不會有預期的行爲。有關實施線索,請閱讀對象Javadoc的equalshashcode

+0

在散列中只有*鍵*必須正確定義散列碼。如果我使用'String'作爲鍵,並且使用String,則'equals()'或'hashCode()'方法可以將我的Froboz對象存儲在HashMap中, )'和'hashCode()'實現已經被正確定義。 – jbindel 2010-10-12 22:09:16

+0

是的。但http://download.oracle.com/javase/6/docs/api/java/util/Collection.html#contains(java.lang.Object)將失敗。 – 2010-10-12 22:14:42

1

請閱讀java.lang.Object中兩種方法的API文檔。它描述了非常重要的重寫的實現應該如何表現。

1

執行equals()時,請確保您瞭解相等和身份之間的區別。 兩個對象實例可能「相等」,但可能不完全相同。 a.equals(b)是您的業務規則應該定義的等式測試。 ==是對象標識(同一個對象實例)