簡體   English   中英

為什么我不能僅僅比較兩個對象的hashCode以確定它們是否相等?

[英]Why can't I just compare the hashCode of two objects in order to find out if they are equal or not?

為什么Eclipse實現的equals方法比較每個值,只比較兩個對象的hashCodes是否更簡單?

據我所知:

  • hashCode總是為相同的輸入生成相同的哈希
  • 因此,如果兩個對象相等,則它們應具有相同的哈希值
  • 如果相等的對象具有相同的哈希值,我可以檢查哈希值以確定對象是否相等

編輯:相關問題,如果實現equals實際上不需要hashCode,為什么在實現equals時總是執行hashCode?

hashCode總是為相同的輸入生成相同的哈希

正確。

因此,如果兩個對象相等,則它們應具有相同的哈希值

正確。

如果相等的對象具有相同的哈希值,我可以檢查哈希值以確定對象是否相等

不合邏輯的推論。 不相等的對象也可以具有相同的哈希碼。 這就是哈希碼的目的。

相關的問題,如果實現equals實際上並不需要hashCode,為什么在實現equals時總是執行hashCode?

因為散列需要使用它,所以在HashMap, HashSet,和好友中使用。 如果您認為您的對象永遠不會被如此使用,請不要覆蓋它,並祝您好運。

為了補充@EJP的答案 ,這是.hashCode()一個完全有效但無用的實現:

@Override
public int hashCode()
{
    return 42; // The Answer
}

簡單地說:每只松鼠都是動物,但並非每只動物都是松鼠。 hashCode通常用於快速查找-它應該高效並且應該在查找表中均勻地分布數據-請參見此處 但是哈希函數會產生沖突,這就是為什么不應將其用作驗證對象相等性的方法。

這完全取決於hashCode的實現-您也可以在fge的答案中看到。

關於為什么當您覆蓋equals時通常需要重新實現它的原因:當從集合(例如HashMap)中存儲和檢索對象時,都使用它們。 hashCode確定地圖上將插入對象的位置,而equals用於標識碰撞桶內的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM