为什么重写了.euqals()方法一定要重写.hashCode()方法

       首先你需要知道的是,一般我们是如何判断两个对象的内容一样的,是不是通过重写的.equals()方法来判断的。----对      那么hashcode()有什么用呢?到底用来是干什么的呢?--------不要着急,我们先从这个问题开始讲起 ! 

       首先我们需要拿出hashcode()的使用场景 , 就是--散列表--,因为hashcode()的使用,也叫hash表(原因是我推测的~~),那么这个表有什么作用呢?作用就是存放一些对象内容不相同的对象。

      来 ,现在建立一个hash表的使用场景:你需要插入一个对象到这个hash表中,那么是不是需要判断这个你要插入的对象的内容和hash表中已有的任一对象的内容都不一样啊。如何判断呢? 是不是就是使用我们自己已经重写过后的.equals()方法呀。但是这个方法需要对hash表进行遍历然后再对每一个已有的元素进行比较呀。这个效率就有点低了,开发这个表就没啥用了呀。所以终于要引出上面说过的hashcode方法了呀。

      首先我们需要来认识一下这个.hashcode()方法,.hashcode()方法未被重写的时候,作用是返回对象的内存地址经过某种算法计算得到的值,这意味着如果两个对象的内存地址不同,它们的哈希码也会不同。然而,这并不意味着两个对象一定不相等,因为不同的对象可能具有相同的内容。这时候我们就可以通过重写hashcode方法来实现:根据对象的内容来计算从而得到哈希码,而不是依赖于对象的内存地址。所以回到hash表,我们是不是可以通过重写后的hashcode的值来判断这两个对象内容是不是相同呀,但是这样又会回到原点了---需要遍历hash表,所以说重写后的hashcode不是这样用的,而是将hashcode通过一系列算法得到hash值 , 让hash值取模运算后映射到hash表中的各个位置上。

      假如这个hash表无限大,是不是就可以对应每一个hashcode值啦,因为重写后得到的不同的hashcode值就代表对象不同的内容,所以这个hash表是不是就实现了存放那些内容不相同的对象的目的了。

      但很可惜的是,这个表是有限的,所以两个不同hash值取模后(当数量足够多时)是不是会相遇在同一个hash表中位置呀,这样就与我们的目的相违背了。想要插入一个对象时,通过重写后得到的hashcode,可以很快的找到要存放的位置,但是这个位置已经有元素了,这个元素的内容是不是不清楚和你要插入元素内容的关系呀,所以这时候需要通过重写后的.equals方法来判断了。

     如果结果为flase ,则代表两元素内容不一致,可以往hash表中添加元素,但是添加到哪?我位置没了呀?--哈-哈-,这就是hash冲突,需要通过我下面写的方法来解决(题外话了,有兴趣的可以去网上学习 ,这面试说不定也会问,也挺重要的 )。当结果为true时,则代表两元素内容相同 ,解决方法,不同的hash表有不同的解决方法,有的是直接不放,有的是替换。

    所以理解了原理后,最后还是回到问题上    --重写了.euqals()方法为什么也要重写hashcode()方法---     当重写了.euqals()方法而没有重写hashcode()方法,这时有一种情况:一个对象通过散列hash值的方法成功进入到了hash表中,但是因为hashcode没有重写--hashcode不一样但是内容不一定不一样 , 所以可能会导致hash表中存在另一个对象x(插入的为y)使得:x和y的hash值不一样(就可能没有相遇) , 但是x.equals(y) == true成立。这就完了呀!和hash表目的相违背了。

   所以得出结论:     重写了.euqals()方法后一般也要重写hashcode()方法                          

   

     这是我的第一篇发布的文章啊,创作动力来源于今天有一个同学问了我这个相关问题,我回答的不是特别好,索性重新整理了一遍思路,才写了这样一份小东西,这问题其实也不是很难,但面试时又常常会问到,网上也有很多人写的很好,这篇东西,只是用我自己的语言来解释了我对这个问题的看法和解决方法。不对请指正啊 ,大伙!哈哈哈。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值