讲下 equals 和 hashcode,他们为何必须一起重写?hashcode 方法重写规则?
目录
1、equals 和 hashCode(哈希码) 是什么?
- 两个都是 Object 类的方法
- 源码中:equals 是通过比较两个对象的地址值
- 源码中:hashCode 是通过将内存地址转换成 Int 值来比较
- 使用环境:equals 方法是比较两个对象的内容,hashcode 方法只可能会在集合中用到
2、equals 和 hashCode 的作用和关系是什么?
- equals 和 hashCode 都是用于比较对象是否相等
- 两者相互依赖但又不相互信任。重写 equals 的实现比较全面且复杂,效率比较低。用hashCode 来比较的话,效率就很高,但并不完全可靠。
3、如果都不重写会怎样?
- 会直接调用 Object 类中的 equals() ,通过对比对象地址来比较
- Object 中是将内存地址进行对比,所以相同的类,new 出两个对象也是不同的,hashCode 也是不同的,所以不符合我们的要求
- 如果遇见去重,比较数据的话,就会出现异常情况
4、只重写 equals 会怎样呢?
- 如果需要大量并快速对比对象的话,equals 效率太低了。
- 这种容器一般为:hashset、hashmap、hashtable等,如:hashset 要求对象不能重复,内部肯定会对每个对象进行比较,所以根据对比规则,如果 hashCode 相同,在用 equals 验证,如果 hashCode 不同,则不同,这样就提高了效率
5、只重写 hashCode 会怎样呢?
- 只重写 hashCode 是不可靠,有时候两个对象生成的 hashCode 可能会一样,会出现异常情况。
- equal() 相等的两个对象他们的 hashCode() 肯定相等,也就是用 equal() 对比是绝对可靠的
- hashCode() 相等的两个对象他们的 equal() 不一定相等,也就是 hashCode() 不是绝对可靠的
6、hashCode 重写规则是什么?
- 两个对象相等,hashCode 一定相等
- 两个对象不等,hashCode 不一定不等
- hashCode 相等,两个对象不一定相等
- hashCode 不等,两个对象一定不等
最后我觉得我可能只是回答了字面上的意思,可能并没有触及到 hash 原理,如有大佬可以告知,非常感谢!
参考文章:https://www.cnblogs.com/keyi/p/7119825.html 其中包含了 示例参考
仅供自己学习参考,如有错误的地方,请大家指出!一起学习