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

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


  • 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() 方法来生成哈希码。这样就保证了在使用哈希表或哈希集合时能够正确地判断对象的相等性和唯一性。

相关文章
|
2月前
|
存储 JavaScript 前端开发
【面试题】JS的14种去重方法,看看你知道多少(包含数组对象去重)
【面试题】JS的14种去重方法,看看你知道多少(包含数组对象去重)
|
2月前
|
前端开发
【面试题】吃透Promise?先实现一个再说(包含所有方法)(二)
【面试题】吃透Promise?先实现一个再说(包含所有方法)(二)
|
2月前
|
存储 运维 前端开发
【面试题】吃透Promise?先实现一个再说(包含所有方法)(一)
【面试题】吃透Promise?先实现一个再说(包含所有方法)(一)
|
8月前
|
Java Linux 程序员
Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)
Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)
|
9月前
|
Java
每日一道面试题之String常用的方法有哪些?
每日一道面试题之String常用的方法有哪些?
|
24天前
|
算法 数据挖掘 大数据
深入解析力扣172题:阶乘后的零(计算因子5的方法详解及模拟面试问答)
深入解析力扣172题:阶乘后的零(计算因子5的方法详解及模拟面试问答)
|
2月前
|
JavaScript
分享经典面试题:JS数组去重的多种方法
分享经典面试题:JS数组去重的多种方法
|
2月前
|
数据采集 Python
2024年Python最新【Python基础教程】快速找到多个字典中的公共键(key)的方法,秋招面试问题
2024年Python最新【Python基础教程】快速找到多个字典中的公共键(key)的方法,秋招面试问题
2024年Python最新【Python基础教程】快速找到多个字典中的公共键(key)的方法,秋招面试问题
|
2月前
|
程序员 PHP Python
2024年Python最全Python基础教程:keys()、values()和 items()方法,百度面试题php
2024年Python最全Python基础教程:keys()、values()和 items()方法,百度面试题php
2024年Python最全Python基础教程:keys()、values()和 items()方法,百度面试题php
|
24天前
|
SQL 算法 大数据
深入解析力扣181题:超过经理收入的员工(自连接方法详解及模拟面试问答)
深入解析力扣181题:超过经理收入的员工(自连接方法详解及模拟面试问答)