2011-07-29 94 views
4

我有一個名爲位置的自定義類。我想要使​​用以下內容: -覆蓋HashCode如果我不需要覆蓋等於

Set<Position> s=new HashSet<Position>(); 

是否必須重寫Position類中的HashCode()方法?我沒有重寫equals()方法。我希望兩個Position對象只有在它們是同一個對象時才被視爲相等。我是否仍然必須重寫HashCode()才能使用如上所示的HashSet?

回答

4

如果您希望不同的對象(可能代表相同的事物)計數爲相等,則只需覆蓋hashcodeequals

(爲了澄清,如果你做覆蓋一個你應該覆蓋其他,這樣的對象是測試作爲平等始終具有相同的哈希碼。)

1

是的!覆蓋其中一個但不是另一個是非常糟糕的風格,並會產生難以調試的微妙的錯誤。在Object [1]的JavaDoc中記錄了一個合同,爲了您自己的利益,應該遵守這個合同。如果你想閱讀更多關於這方面的內容,請閱讀這本非常好的書籍Effective Java [2]的第7項。

編輯:對不起,我讀錯誤。如果你不覆蓋其中的一個,你不需要做任何事情。不過,閱讀書中的項目。實施這兩種方法總是一個好主意。

0

如果您使用的是Map,那麼就有一個稱爲IdentityHashMap的特殊類,它專門爲此目的而構建,即比較鍵時使用引用相等來代替對象相等。