一分钟理解equals和hashCode的关系

一分钟理解equals和hashCode的关系

首先我们来了解一下hashCode
hashCode()的作用:是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode()函数。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码(可以快速找到所需要的对象)

提问:重写了equals一定要重写hashCode方法吗?

答:一定要重写,因为集合判断一个元素是否已经存在就是通过hashCode来判断的,如果重写了equals而没有重写hashCode会导致集合元素找不到而永久丢失。
举例:
我们就以HashMap的数据插入原理来说:
1.判断数组是否为空,为空进行初始化;
2.不为空,计算 k 的 hash 值,通过(n - 1) & hash计算应当存放在数组中的下标 index;
3.查看 table[index] 是否存在数据,没有数据就构造一个Node节点存放在 table[index] 中;
4.存在数据,说明发生了hash冲突(存在二个节点key的hash值一样), 通过equals继续判断key是否相等,相等,用新的value替换原数据(onlyIfAbsent为false);

两者关系:

  • 如果equals相等,则hashcode一定也是相同的
  • 两个对象的hashcode值相同,equals不一定是相等的
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值