前言
看了挺多关于这个问题相关的文章,发现回答缺少因果逻辑。直到看了一篇文章提到 《Effective Java》中有关于这个问题的答案。于是找了电子书看了一下,查看相关源码理清了因果逻辑,得出怎样回答这个问题比较好。
1 hashCode 的通用约定
查看 Object 类的源码
简单理解:
- 两个对象根据 equals 方法返回 true,那么这两个对象的 hashCode 必须相等。
- 两个对象根据 equals 方法返回 false,那么不要求这两个对象的 hashCode 不相等。
2 为什么重写 equals 方法要重写 hashCode 方法
因为,不重写 hashCode 方法,会出现两个对象根据 equals 方法比较后返回 true,然而这两个对象的 hashcode 值不相等。这违反了 Object.hashCode 的使用约定,从而使该类无法与基于散列值的集合类一块运作,比如 hashMap。
3 为何要有 hashCode 这个 int 值
Object 类的 equals 方法很简单。从源码上看,比较两个对象的内存地址。
但重写之后的类的 equals 方法往往很复杂。比如 String 类的 equals 方法
这就使得 equals 方法的效率低。为了提高比较效率,所以有了 hashcode 这个值。基于散列值的集合类,根据 hashcode 使用约定,当 hashCode 值不同,就没必要比较 equals 方法。当 hashCode 值相同时,再比较 equals 方法。