hashCode 契約:
- 在一個運行的進程中,相等的對象必須要有相同的哈希碼
- 請注意這并不意味著以下常見的誤解:
- 不相等的對象一定有著不同的哈希碼——錯!
- 有同一個哈希值的對象一定相等——錯!
注意點:
- 哈希碼的數量: 2^32 40多億
- 手動實現equals方法的時候,一定要同時實現 hashCode 方法
為什么?
因為一個對象的 hashCode 方法需要與 equals 方法考慮同樣的域。 通過重寫 equals 方法,將申明一些對象與其他對象相等,但是 Object 中的 hashCode 方法將所有的對象看做是不同的。所以你將會有不同哈希碼的相同對象。例如,在 HashMap 中調用contains 方法會返回 false,即使這個對象已經被添加。
- 永遠不要把哈希碼用作一個 key
生日悖論 現象能解釋這個事情。哈希碰撞會有很大的幾率發生。
- 在分布式應用中不要使用哈希碼
例如:不應該使用哈希碼來持久化狀態,因為下次運行時候,"相同"對象的哈希碼可能不同。