当前位置: 首页 > article >正文

为什么重写equals时必须重写hashCode()

不重写equals和不重写 hashCode()之前:equals()比较的是对象的内存地址,hashCode()比较的其实也是内存地址(内存地址输入到哈希函数中得到的整数)

重写了之后,equals()比较的是对象的内容值,如果hashCode()不重写,还是比较地址的话,就会出现equals()认为两个对象相同,但是hashCode()认为两个对象不相同

我们希望的是equals()认为相同的两个对象,hashCode()结果是一样的。

首先equal()和hashCode()两个方法都是Object类中的方法,由于所有对象都继承了Object方法,所以所有类都有这两个方法

hashCode()方法:将对象的地址值映射为integer类型的哈希值

比如String类,如果重写equals方法,但是不重写hashCode()方法

String s1=new String("abc");

String s2=new String("abc");

 如果你调用s1.equals(s2) 返回的是True,但是s1对象和s2对象算出来的哈希值显然是不同的

也就是会产生:equals()方法认定相同的两个对象却有不同的哈希值的问题

我们希望equals()方法认定相同的对象有相同的哈希值

哈希值不等的两个对象一定不是同一个对象

哈希值相等的两个对象不一定是同一个对象,还要调用equals()方法,进一步判断这两个对象是不是同一个对象

当往HashMap中插入一条key-value时,其中key是一个String类对象,比如map("abc","test1")

判断key-value这个键值对的key这个对象是否存在,根据这个key求出哈希值,如果HashMap里面没有这个哈希值,说明HashMap里面没有这个对象,就可以存入这个key-value

如果已经有这个哈希值,就要调用equal方法,与已经存在的这个哈希值的key-value的key进行比较,如果判定两个key-value的key是同一对象,那就覆盖,不是同一对象就产生哈希冲突,挂在链表上或者红黑树上

下面这段代码中

        String s1=new String("abc");

        String s2=new String("abc");

        HashMap map=new HashMap();
        map.put(s1,"test1");
        map.put(s2,"test2");

        System.out.println(map.get(s1));//test2
        System.out.println(map.get(s2));//test2

 两个key-value的key对应的对象哈希值(对象地址输入到哈希函数中得到的整数)是一样,equals()方法判定两个对象也是一样的,所以会后者key-value覆盖前者的key-value

如果你重写了String类的equals方法,没有重写hashcode()方法,插入HashMap中第一步判断哈希值(因为不重写的话,哈希值就等于对象地址进行哈希运算得到的整数,地址不同,哈希值就不同)就不相等,那就会认为这是两条不同key-value,也就不会进行覆盖


http://www.kler.cn/a/15618.html

相关文章:

  • Ubuntu22.04LTS 部署前后端分离项目
  • 2024年09月CCF-GESP编程能力等级认证Python编程三级真题解析
  • 校园二手交易网站毕业设计基于SpringBootSSM框架
  • 动手学深度学习73 课程总结和进阶学习
  • 环境贴图选用方式
  • 消息中间件分类
  • 【容器化应用程序设计和开发】2.2 Dockerfile 的编写和最佳实践
  • ChatGPT会一直火热下去吗?他会是下一个AR,区块链吗?
  • WRF模式应用:天气预报、模拟分析观测气温、降水、风场、水汽和湿度、土地利用变化、土壤及近地层能量水分通量、土壤、水体、植被等相关气象变量
  • 分治算法(Divide and Conquer)
  • Winform从入门到精通(34)—SaveFileDialog(史上最全)
  • 10.Yarn概述
  • ESP32 ESP-Rainmaker 本地点灯控制Demo测试
  • leetcode19_删除链表的倒数第 N 个结点
  • 【unity】C#协程IEnumerator的使用(上)
  • 【Leetcode每日一刷】动态规划:931. 下降路径最小和
  • Apache Flink
  • Nature Neuroscience:高家红团队首次发布中国人脑连接组计划研究成果及其大数据资源
  • 前端学习笔记:CSS的引入,元素选择器
  • java+mysql医院住院挂号缴费病房信息管理系统
  • 管理后台项目-07-菜单管理和动态展示菜单和按钮
  • API淘宝数据接口
  • 0426 java内部类
  • 针对Vue前后端分离项目的渗透思路
  • 【Python_Opencv图像处理框架】信用卡数字识别项目
  • ORACLE常用命令