• 【面试题精讲】为什么重写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);
        }
    }
    • 1
    • 在上面的示例中,重写了 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 多平台发布

  • 相关阅读:
    论文投稿指南——收藏|SCI论文投稿注意事项
    Windows 11 电脑黑屏 + Office软件打不开?
    springboot+vue毕业生离校系统
    由国内知名企业开源人工智能项目想到的
    .NET6 开源之JSON 2 SQL (JORM框架)
    国内啤酒行业数据浅析
    网络安全(黑客)自学
    【webpack】从零开始配置webpack系列(原理篇)
    Spring 控制反转和依赖注入
    竞赛 题目:基于python的验证码识别 - 机器视觉 验证码识别
  • 原文地址:https://blog.csdn.net/njpkhuan/article/details/133659097