您现在的位置是:首页 > 编程 > 

为什么重写equals()方法时必须重写hashCode()方法【详解】

2025-07-24 11:52:39
为什么重写equals()方法时必须重写hashCode()方法【详解】 一、为什么重写equals()方法时必须重写hashCode()方法1、关于hashCode()的约定hashCode()方法源码注释:代码语言:javascript代码运行次数:0运行复制If two objects are equal according to the {@code equals(Object)} met

为什么重写equals()方法时必须重写hashCode()方法【详解】

一、为什么重写equals()方法时必须重写hashCode()方法

1、关于hashCode()的约定

hashCode()方法源码注释:
代码语言:javascript代码运行次数:0运行复制
If two objects are equal according to the {@code equals(Object)}
method, then calling the {@code hashCode} method on each of
the two objects must produce the same integer result.

意思就是:如果两个对象根据equals()方法比较是相等的,那么调用这两个对象的hashcode()方法也必须产生相同的结果;

2、equals()方法和hashCode()方法的关系

  • 如果两个对象相同(即:用 equals 比较返回true),那么它们的 hashCode 值一定要相同;
  • 如果两个对象的 hashCode 值相同,但是它们并不一定相同(即:用 equals 比较返回 false);

、为什么一定要使用 hashcode() 方法

根本原因是为了提升程序运行效率

hashCode()方法返回一个hashCode值,实际上就是一个int整数;

hashCode值的作用是确定该对象在哈希表中的索引位置;

根据上面equals()和hashCode()的关系,我们在比较两个对象是否相同的时候可以先比较他们的hashCode值,如果hashCode值不同的话就没有必要再使用equals()进行比较了,因为使用equals()进行比较本身就是一个低效率的过程;

举例说明:

我们都知道list集合是有序的,可以重复,set集合是无序的,不可以重复,那么怎么保证放入的元素不重复呢?仅仅使用equals()方法是不可能的,比如要存放第10001个元素,难道要与前面10000个元素挨个equals()比较吗?这效率太低了,因此hashCode就应运而生了!Java就采用了哈希表,利用哈斯算法(也叫散列算法),将对象数据根据其特征使用特定的算法将其定义到一个地址上,那么在后面存放进来的数据只需要首先判断对应的地址是否有数据,如果有就先比较它们的hashCode是否相等,如果相等就再使用equals()比较内容是否相同,反之直接插入,(同样,比较两个对象是否相同,也可以先比较两个对象的hashCode是否相等,如果相等再进行equals()比较,反之直接返回false即可)这样就大大减少了使用equals()的次数,提升了程序运行效率

简而言之,重写hashcode()方法的目的就是:保证使用equals()方法比较相同的对象,所对应的hashCode值也相同的;

4、HashMap结构

参考文章:

复习一波HashMap底层实现原理解析

HashMap结构:数组 + 链表(或红黑树(JDK8开始),当链表长度超过8,就会转成红黑树,以提高查询效率);

HashMap结构图:

5、重写hashcode()方法演示

代码演示:
代码语言:javascript代码运行次数:0运行复制
package com.zibo.java.february.second;

public class MyEquals {
    public static void main(String[] args) {
        Student s1 = new Student("訾博", 24);
        Student s2 = new Student("訾博", 24);
        println((s2)); // true
        println(s1.hashCode());
        println(s2.hashCode());
    }
}
class Student{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, Integer age) {
         = name;
        this.age = age;
    }

    // 咱们来手动定制equals()方法
    @Override
    public boolean equals(Object o) {
        // 两个对象堆内存地址相同,说明是同一个对象,自然内容也相同
        if(this == o){
            return true;
        }
        // 先判断是否是一个Student的实例对象,如果是向下转型进行比较,反之直接返回false
        if(!(o instanceof Student)){
            return false;
        }
        // 向下转型,继续判断每个值是否相等
        Student student = (Student)o;
        return .equals() && this.age == student.age;
    }

    // 我这里使用idea一键重写了,具体该怎么重写hashCode()方法、有什么规则,暂不讨论
    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 1 * result + age;
        return result;
    }
}
运行结果:

(如果没有重写hashCode()方法,下面两个int值是不同的,因为Object类默认实现的hashCode()方法是根据对象所存储的的堆内存地址计算出来的,既然是两个对象堆内存地址自然不同,因此hashCode不同!)

代码语言:javascript代码运行次数:0运行复制
true
4671292
4671292
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent 删除对象算法效率equalshashcode

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1200849.html

相关标签:无
上传时间: 2025-07-23 20:33:21
留言与评论(共有 16 条评论)
本站网友 广清
22分钟前 发表
如果相等就再使用equals()比较内容是否相同
本站网友 飞腾浏览器
10分钟前 发表
为什么一定要使用 hashcode() 方法根本原因是为了提升程序运行效率;hashCode()方法返回一个hashCode值
本站网友 2011年日本地震
13分钟前 发表
如有侵权请联系 cloudcommunity@tencent 删除前往查看对象算法效率equalshashcode
本站网友 金紫公园
26分钟前 发表
Integer age) { = name; this.age = age; } // 咱们来手动定制equals()方法 @Override public boolean equals(Object o) { // 两个对象堆内存地址相同
本站网友 儿童奶粉什么牌子好
26分钟前 发表
如果hashCode值不同的话就没有必要再使用equals()进行比较了
本站网友 朝阳医院网上预约挂号
3分钟前 发表
为什么重写equals()方法时必须重写hashCode()方法1
本站网友 珠海万科城市花园
1分钟前 发表
继续判断每个值是否相等 Student student = (Student)o; return .equals() && this.age == student.age; } // 我这里使用idea一键重写了
本站网友 吾就爱智能
2分钟前 发表
(同样
本站网友 非梦卡盟网站
16分钟前 发表
实际上就是一个int整数;hashCode值的作用是确定该对象在哈希表中的索引位置;根据上面equals()和hashCode()的关系
本站网友 宫内节育器
12分钟前 发表
如果hashCode值不同的话就没有必要再使用equals()进行比较了
本站网友 翼年代记
19分钟前 发表
如果相等再进行equals()比较
本站网友 胸腔穿刺术
25分钟前 发表
如果相等再进行equals()比较
本站网友 3u8864
26分钟前 发表
就会转成红黑树
本站网友 自动加好友
11分钟前 发表
利用哈斯算法(也叫散列算法)
本站网友 汽车计算器
24分钟前 发表
暂不讨论 @Override public int hashCode() { int result = name != null ? name.hashCode()