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

【面试题精讲】为什么重写equals时必须重写hashCode方法?

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

首发博客地址[1]

面试题手册[2]

系列文章地址[3]


  • equals() 方法用于比较两个对象是否相等,而 hashCode() 方法用于获取对象的哈希码。
  • 在 Java 中,如果两个对象通过 equals() 方法判断为相等,则它们的 hashCode() 方法必须返回相同的值。这是因为在使用哈希表(如 HashMap、HashSet)等数据结构时,会先根据对象的哈希码确定存储位置,然后再使用 equals() 方法进行比较来确保唯一性。
  • 如果重写了 equals() 方法但没有重写 hashCode() 方法,那么可能会导致以下问题:
    • 当将对象放入哈希表中时,由于 hashCode() 返回的不是相同的值,哈希表无法正确定位到该对象所在的位置,从而无法正常操作该对象。
    • 当使用哈希集合(如 HashSet)时,由于 hashCode() 返回的不是相同的值,哈希集合无法正确判断两个对象是否相等,从而可能导致重复元素的存在。
  • 因此,在重写 equals() 方法时,必须同时重写 hashCode() 方法,以保证对象的相等性和哈希码的一致性。
  • 下面是一个示例代码:
public class Person {
    private String name;
    private int age;

    // 构造方法、getter 和 setter 省略

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
  • 在上面的示例中,重写了 equals() 方法来比较两个 Person 对象的 name 和 age 属性是否相等,并且使用 Objects 类的 equals() 方法进行判断。同时,重写了 hashCode() 方法来计算对象的哈希码,使用 Objects 类的 hash() 方法来生成哈希码。这样就保证了在使用哈希表或哈希集合时能够正确地判断对象的相等性和唯一性。

参考资料

[1]

首发博客地址: https://blog.zysicyj.top/

[2]

面试题手册: https://store.amazingmemo.com/chapterDetail/1685324709017001

[3]

系列文章地址: https://blog.zysicyj.top/categories/技术文章/后端技术/系列文章/面试题精讲/

本文由 mdnice 多平台发布

http://www.lryc.cn/news/184581.html

相关文章:

  • 一文搞懂pytorch hook机制
  • 文本挖掘入门
  • 【C++ techniques】Smart Pointers智能指针
  • LabVIEW利用以太网开发智能液位检测仪
  • 文字转语音:语音合成(Speech Synthesis) 数组文字循环播放
  • Spark基础
  • localhost和127.0.0.1都可以访问项目,但是本地的外网IP不能访问
  • 快速掌握批量合并视频
  • OpenCV利用Camshift实现目标追踪
  • 使用pywin32读取doc文档的方法及run输出乱码 \r\x07
  • 一天一八股——TCP保活keepalive和HTTP的Keep-Alive
  • 头部品牌停业整顿,鲜花电商的中场战事迎来拐点?
  • 深入解读redis的zset和跳表【源码分析】
  • elasticsearch内存占用详细分析
  • 【研究生学术英语读写教程翻译 中国科学院大学Unit3】
  • 基于虚拟同步发电机控制的双机并联Simulink仿真模型
  • 微信小程序开发——自定义堆叠图
  • 国庆day5
  • 经典算法----迷宫问题(找出所有路径)
  • macOS下 /etc/hosts 文件权限问题修复方案
  • 【星海出品】ansible入门(二) playbook
  • Spring Boot对账号密码进行加密储存
  • 总结js中常见的层次选择器
  • 阿里云ECS服务器上启动的portainer无法访问的问题
  • JavaScript系列从入门到精通系列第十八篇:JavaScript中的函数作用域
  • 开环模块化多电平换流器仿真(MMC)N=6(Simulink仿真)
  • [C]嵌入式中变量存储方案
  • 热迁移中VirtIO-PCI设备的配置空间处理
  • 模拟滤波器的基础知识和设计
  • 机器学习基础-Pandas学习笔记