2011-09-09 55 views
0

我有一個Integer字段的兩個簡單包裝類,我必須重寫equals()和hashCode()。最後,它們都對hashCode()使用相同的算法,所以如果Integer字段相同,則哈希碼會發生衝突。不同類別的散列碼碰撞

由於對象是不同的類型有這個問題,或者我應該只關心我是否希望將它們混合爲同一個HashMap中的鍵?

回答

13

hashCode()等於兩個對象說「存在的機會這些對象是平等的,請通過調用equals()仔細查看」。只要這些類的equals()方法是正確的,哈希代碼是相同的並不是問題。

hashCode()的一般規則是,如果兩個對象相等,它們的散列碼也應該相等。請注意,該規則不是「如果兩個對象具有相同的哈希碼,那麼它們應該是相等的。」

1

如果你可能有一個哈希映射與兩個類型的對象具有相同的值,那麼顯然這將是一個潛在的性能問題。 HashMap等沒有看到實際的運行時類 - 事實上並沒有一個標準的方法來判斷不同類的兩個對象是否可以相等(例如,List s具有相同的順序ArrayListArrays.asList應該比較相等)。對於HashMap,我猜測命中不會太糟糕,但可能會更糟糕,比如說,在第一次檢查中獲得重大收益的探測實施。