hashCode()的全面解析!

1、hashCode有什么用?

hashCode()的作用是获取哈希码(int 整数),也称为散列码,哈希码的作用是确定该对象在哈希表中的索引位置。

hashCode()定义在JDK的Object类中,这就意味着Java中的任何类都包含hashCode

2、为什么要有hashCode?

以HashSet如何检查重复为例来说明为什么要有hashCode?

当把一个对象加入HashSet时,HashSet会先计算这个对象的HashCode值来判断对象插入的位置,同时也会与其他已经加入的对象的hashCode值作比较,如果没有相同的HashCode值,HashSet会认为没有重复的对象出现;但如果发现有相同的HashCode值,这时会调用equals()方法来检查HashCode值相等的对象是否真的相同,如果两者相同,HashSet就不会让其加入操作,如果不同的话,就会重新散列到其他位置,这样就大大减少了equals的次数,相应就大大提高了执行速度。

其实,hashCode()和equals()方法底层都是用于比较两个对象是否相等。 

3、为什么JDK还要同时提供两个方法呢?

这是因为在一些容器中(HashMap、HashSet)中,有了hashCode()之后,判断元素是否在对应容器中的效率会更高(参考添加元素HashSet的过程),也就是说HashCode帮我们大大缩小了查找成本。

那为什么不只提供HashCode()方法呢?

这是因为两个对象的HashCode值相等,并不代表两个对象就相等。

那为什么两个对象有相同的HashCode值,却不一定相等呢?

这是因为HashCode()所使用的哈希算法刚好会让多个对象传回相同的哈希值,越糟糕的哈希算法越容易碰撞,也即哈希冲突(不同的对象得到相同的哈希值),这也与数据值域的分布特性有关

4、为什么重写equals()方法时必须重写hashCode()方法?

 两个相等的对象,HashCode值必须相等,如果使用equals()方法判断两个对象是相等的,那这两个对象的HashCode值也要相等。

如果重写equals()方法时没有重写HashCode()方法,就会导致equals()方法判断的是两个相等的对象,HashCode值却不相等。

总结来说就是:
  • 如果两个对象的HashCode值相等,那这两个对象不一定相等(哈希冲突)
  • 如果两个对象的HashCode值相等,并且equals()方法也返回true,才认为这两个对象相等
  • 如果两个对象的HashCode值不相等,则可以直接认为这两个对象不想等
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值