美文网首页
为什么重写equals必须重写hashcode方法

为什么重写equals必须重写hashcode方法

作者: yiqiquhuxi | 来源:发表于2022-05-05 18:45 被阅读0次

    想必大家在平时的学习当中这个问题再熟悉不过了,但是为什么重写equals必须重写hashcode方法,很多程序员都不理解,今天来具体说说
    ——————————————————————————————————
    首先,两个方法都是object类自带的原生方法方法:


    image.png
    • equals 实现:
      image.png

    用==比较(基本数据类型比较值是否相等,引用数据类型比较的是内存地址是否相等)
    (注:这里的实现仅是object类的实现,这是基础)

    • hashcode实现
      image.png

    这里用native修饰,说白了就是本地方法库里面用c++封装好的,不需要我们去关心(有兴趣的可以去github上面搜openjdk源码),我们可以理解:返回对象的内存地址的hashcode码,说白了在这里每个对象的hashcode码是不一样的(当然也有例外,在本篇无意义,不阐述)

    —————————————————————————————————————

    在我们开发中,重写了equals之后 ,不重写hahscode,程序依然不会报错
    但是,java有条规定:

    equals相等, hashcode一定相等;hashcode相等, equals不一定相等

    java里面很多地方利用这条规定,先判断hashcode值是否相等,再去判断equals是否相等(为了提交效率),比如, hashmap,数组+链表中的链表比较就是利用先hashcode比较再equals比较,如果我们不重写hashcode的话,只重写equals方法,equals方法我们重写为只要对象里面某个值相等,就说明这个对象相等,比如下图,但是却没有重写hashcode,那么把该对象放入hashmap中,先利用hashcode比较两对象内存地址是否相等,hashcode肯定不相等的,但是这里equals相等的,这就和上面的这条规定相悖。

    image.png

    该class里面两个属性(name和age),我们重写equals方法,只要求name相等,则两对象相等,但是没有重写hashcode,放入hashmap则是两个对象。违背了java的原则(equals相等, hashcode一定相等;hashcode相等, equals不一定相等

    相关文章

      网友评论

          本文标题:为什么重写equals必须重写hashcode方法

          本文链接:https://www.haomeiwen.com/subject/foroyrtx.html