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

深入学习hashCode 和equals()方法的关系

在java中,每个对象都可以调用hashCode()方法得到自己的哈希值(一串数值),就像人的指纹一样。但是在java中对象并不能做到像人一样,指纹都是唯一的。

在判断两个对象之间是否想等时,我们通常使用hashCode()方法和equals()方法。

  • 如果两个对象之间的hashCode不相同,那么这两个对象肯定是不相等的对象;
  • 如果两个对象的hashCode相同,那么这两个对象可能是相等,也可能不相等;
  • 如果两个对象相等,那么这两个对象的hashCode 一定相等;

在比较两个对象是否想等时,一般会先调用hashCode方法,如果hashCode相同,再调用equals()方法进行比较,因为hashCode()

实现比较轻(一串数值),equals()方法比较重,不同对象的equals()可能不相同。

   // Integer 的equals()
   public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

  // String 的equals()
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

由上可知,不同对象的equals()方法不相同。
在这里插入图片描述

如上,两个对象只重写了equals()方法,没重写hashCode()方法,所以这两个对象是不相等的。而HashMap的get()方法,先通过对比hashCode,再对比equals()方法判断是否已存在对象的key,new User(“zhangsan”) 作为一个新的对象,所以hashMap中不存在以new User(“zhangsan”) 为key的值

在这里插入图片描述

重写hashCode 后如下:可见重写了equals()方法一定要重写hashCode()方法
在这里插入图片描述


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

相关文章:

  • 【渗透测试术语总结】
  • AR 眼镜之-拍照/录像动效切换-实现方案
  • Linux web服务器
  • [笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server
  • BoltzGnu Boltztrap数据绘图脚本
  • vue2日历组件
  • 数据结构:二叉树
  • 兆芯最新X86 CPU曝光:性能与英特尔/AMD相比,没落后10年
  • Adobe国际认证师资培训线下班于青岛黄海继续教育中心成功举行!
  • 使用React + Antd4.x + React Router 6.x 封装菜单(多级菜单)和动态面包屑
  • Lazada新店运营思路--店铺成长期的营销玩法
  • 无线自动灌溉系统设计_kaic
  • 集合详解之(三)单列集合接口Set及具体子类HashSet、TreeSet
  • 【redis】RBD-内存快照
  • Vue-封装一个通用的分页组件,并实现全局注册组件使用
  • cyberdefenders—-恶意软件流量分析 2
  • 【分享】如何写出整洁的代码?
  • 《数学建模实战攻略:引言》
  • 第02章_MySQL环境搭建
  • 蓝牙耳机品牌哪个好?好用的无线蓝牙耳机推荐
  • 蓝牙耳机什么牌子便宜耐用?2023年好用实惠的蓝牙耳机推荐
  • 2023给自己规划一个新的起点---Android车载工程师
  • this关键字
  • 【Python入门第四十三天】Python丨NumPy 数据类型
  • Tars请求过程与协议分析
  • 2023蓝桥杯省模拟赛——滑行