hashCode 契约:
- 在一个运行的进程中,相等的对象必须要有相同的哈希码
- 请注意这并不意味着以下常见的误解:
- 不相等的对象一定有着不同的哈希码——错!
- 有同一个哈希值的对象一定相等——错!
注意点:
- 哈希码的数量: 2^32 40多亿
- 手动实现equals方法的时候,一定要同时实现 hashCode 方法
为什么?
因为一个对象的 hashCode 方法需要与 equals 方法考虑同样的域。 通过重写 equals 方法,将申明一些对象与其他对象相等,但是 Object 中的 hashCode 方法将所有的对象看做是不同的。所以你将会有不同哈希码的相同对象。例如,在 HashMap 中调用contains 方法会返回 false,即使这个对象已经被添加。
- 永远不要把哈希码用作一个 key
生日悖论 现象能解释这个事情。哈希碰撞会有很大的几率发生。
- 在分布式应用中不要使用哈希码
例如:不应该使用哈希码来持久化状态,因为下次运行时候,"相同"对象的哈希码可能不同。