前言
网上关于这个问题的答案有很多,也会给出相关示例,但是看完之后感觉解答的并不是“为什么”,而是回答了“是什么”,看到一篇文章后(时间太长,忘了原文章地址),恍然大悟,再次记录一下。
先说答案
为了保证hashCode()方法的设计定义。
解释
equals本质是==,也就是比较对象的地址。对于自定义对象,两个内容相同的对象,地址是不同的。这不符合我们的预期,所以需要重写equals来保证,内容相同的对象,equals判断也是相同的。
为什么还要重写hashcode呢?是为了维护hashcode 的设计定义。定义如下:
- 一个对象多次调用hashcode方法,值相同
- 两个对象用equals方法判断相同,则他们hashcode值相同
- hashcode不同的对象,equals判断也不相同。
hashcode是通过对象地址计算的一个值,两个内容相同的对象,地址不同,如果只重写equals不重写hashcode方法,就会有equals判断相等,hashcode判断不相等的情况出现,破坏了hashcode的定义
举个例子,hashmap的put,先计算hashcode,在用equals判断,可能只重写equals不重写hashcode方法,就会导致一个hashmap有重复的key出现
equals()方法
equals()方法继承来自Object类,默认使用==判断,也就是判断当前两个对象的值是否相同(基础类型判断值,引用类型判断地址–java只有值传递)
public boolean