• 重写equals为什么要重写hashcode


     三个方面去理解“重写equals为什么要重写hashcode”:

    1.Object中hashCode()的源码注释

    1. 源码 hashCode()的注释的最后一段的括号中写道:将对象的地址值映射为integer类型的哈希值。

    2. 源码 equals()的注释:当我们将equals方法重写后有必要将hashCode方法也重写,这样做才能保证不违背hashCode方法中“相同对象必须有相同哈希值”的约定。

    3. Object类中的equals方法区分两个对象的做法是比较地址值,即使用“==”。而我们如若根据业务需求改写了equals方法的实现,那么也应当同时改写hashCode方法的实现。否则hashCode方法依然返回的是依据Object类中的依据地址值得到的integer哈希值。

    2.从String的equals()方法去看

    1. String对象在调用equals方法比较另一个对象时,除了认定相同地址值的两个对象相等以外,还认定对应着的每个字符都相等的两个String对象也相等,即使这两个String对象的地址值不同(即属于两个对象)。
    2. String类中对equals方法进行重写扩充了,但是如果此时我们不将hashCode方法也进行重写,那么String类调用的就是来自顶级父类Obejct类中的hashCode方法。即,对于两个字符串对象,使用他们各自的地址值映射为哈希值,导致结果最后不同。

    3.从集合类的源码中去看

    1. HashMap存储数据的时候,是取的key值的哈希值,然后计算数组下标,采用链地址法解决冲突,然后进行存储。
    2. 取数据的时候,依然是先要获取到哈希值,找到数组下标,然后for遍历链表集合,进行比较是否有对应的key。


    参考链接:
    https://zhuanlan.zhihu.com/p/50206657
    https://www.jianshu.com/p/0e1176a9bad1
    https://blog.csdn.net/xl_1803/article/details/80445481 (这篇文章下面评论较多)

    天助自助者
  • 相关阅读:
    软件测试职业规划(初版)
    http-server简易的HTTP服务解决数据传输问题
    moco框架的使用
    sublime3安装部署及插件安装
    Tomcat下载部署及解决中文乱码显示
    Linux磁盘管理
    DVWA学习记录 PartⅨ
    DVWA学习记录 PartⅧ
    DVWA学习记录 PartⅦ
    DVWA学习记录 PartⅥ
  • 原文地址:https://www.cnblogs.com/ZeGod/p/13320785.html
Copyright © 2020-2023  润新知