为什么要重写hashCode

== 与equals 的区别

==

使用==的时候会根据对象的类型为引用对象还是值对象分开处理,如果是值对象的话会直接比较2个值是否相等,如果是引用对象的话会比较内存地址是否相同

equals

equals 是Object 类提供的方法,除了值对象之外的其他对象都可以通过调用equals比较,如果没有重写此方法那么实质上也是比较2个对象的内容。
在这里插入图片描述

为什么需要重写equals

当我们的对象之间是否相等需要根据对象的内容判断而不是通过对象存储的地址判断的时候我们就需要重写equals。
比如有一个用户类(User),里面有用户编号的属性,不管这个对象是根据什么情况创建出来的,只要他们的编号相同,我们就认为他们是相等的,这个时候就要重写equals。

为什么要重写hashCode

  1. 前面提到了为什么要重写equals,请看下图,在Object类的equals中有这样一段描述
    在这里插入图片描述
    这段内容上描述的是当我们重写equals方法的时候,我们同样需要重写hashCode方法,因为在object类上约定**‘相等’**的2个对象hashCode方法需要返回相同的值
  2. 重写hashCode 会影响到HashMap,HashSet等一系列的使用
    在这里插入图片描述

补充

  1. hashCode 相等的时候对象不一定相等,但是2个对象如果使用equals判断相等,那么他们的hashCode 一定相等。如果2个对象equals不相等但是hashCode相等 这个现象就是hash冲突,原因是hashCode是程序通过一系列算法计算出来的,所以存在重复的可能性。
  2. 在hashCoe不可靠的情况下为什么还要使用它,因为hashCode比较的效率比equals要高,如果hashCode不一样那么equlas就没有必要调用了,可以提高性能
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值