为什么重写equals一定要重写hashcode?

link1link2link3link4link5link6

主要是为了提升哈希表的性能。因为HashMap 集合类使用了 hashCode() 方法来计算对象在哈希表中应该存储的位置,如果不重写hashcode值一样的对象。因为new出来的对象即使值相同,存储地址必不相同。不重写 hashCode会导致为值相同的对象分别了两个存储空间,导致了空间浪费。因此要重写。

以下是关于hashcode的一些性质:

两个对象相等,hashcode一定相等

两个对象不等,hashcode不一定不等

hashcode相等,两个对象不一定相等

hashcode不等,两个对象一定不等

重写hashCode遵循的五个条件

在改写equals方法时,也要遵守他们的通用约定(equals方法实现了等价关系):

​ \1. 自反性:x.equals(x) = true;

​ \2. 对称性:如果有x.equals(y) = true,那么一定有y.equals(x) = true;

​ \3. 传递性:对任意的x,y,z。如果有x.equals(y) = y.equals(z) = true,那么一定有x.equals(z)= true;

​ \4. 一致性:无论多少次调用,x.equals(y)总会返回相同的结果。

​ \5. 非空性(暂定):所有的对象都必须!=null;

上面的只是理论性的说法,更加具体的做法如下:

​ \1. 使用==操作符检查“实参是否为指向对象的一个引用”,如果是则返回true;

​ \2. 使用instanceof操作符检查“实参是否为正确的类型”,如果不是,则返回false;

​ \3. 将实参装换为正确的类型;

​ \4. 对于该类中的每一个关键域,检查实参中的域与当前对象中对应的域是否匹配。如果所有测试都成功,则返回true,否则返回false。

​ \5. 方法完成之后,确定equals方法的对称性,传递性,一致性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值