为什么重写equals方法同时需要重写hashCode方法?

【学习笔记】人群归因分数 PAF 以及combined PAF(更新) 在此推荐2篇发表在lancet以及jama子刊上的paf文章,这两篇文章套路是一样的,只是在不同国家进行。希望对大家学习PAF有所帮助,后面有新内容也会继续分享,也欢迎大家分享使用R语言计算PAF的经验~~~的时候,先建立了相关矩阵,再做主成分分析,得到communality。详细信息大家可翻阅原文。 阅读详情

为什么重写equals方法同时需要重写hashCode方法?

众所周知equals()和hashCode()是Object类中定义的方法。Object类定义的方法如下:

Object的equals()定义如下:

注释部分大概意思是:

请注意,每当重写此方法时,通常需要重写哈希代码,其中规定相等的对象必须具有相等的哈希代码。

Object的hashCode()定义如下:

以上是Object类的定义,我们通过一段代码来解释“为什么重写equals方法同时需要重写hashCode方法?”。

首先我们定义一个实体类RewriteEqHashCode,重写equals()和hashCode()方法:

package com.others.rewritehasheq;

import java.io.Serializable;
import java.util.Objects;

public class RewriteEqHashCode implements Serializable {

	private static final long serialVersionUID = -1639762516649859102L;

	private Integer id;
	private String name;

    public RewriteEqHashCode(Integer id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

    public RewriteEqHashCode(Integer id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        RewriteEqHashCode that = (RewriteEqHashCode) o;
        return Objects.equals(id, that.id) &&
                Objects.equals(name, that.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

}

然后我们定义一个测试类ValidateEqHashCode:

package com.others.rewritehasheq;

import java.util.HashSet;

/**
 * 为什么重写equals方法同时需要重写hashCode方法
 *
 * @author 小辉GE/小辉哥
 * <p>
 * 2019年8月29日 下午23:00:00
 */
public class ValidateEqHashCode {

    public static void main(String[] args) {
        HashSet<Object> hashSet = new HashSet<Object>();
        hashSet.add(new RewriteEqHashCode(1001, "张三"));
        hashSet.add(new RewriteEqHashCode(1002, "李四"));
        hashSet.add(new RewriteEqHashCode(1003, "王五"));
        hashSet.add(new RewriteEqHashCode(1001, "张三"));
        //遍历
        hashSet.forEach((o) -> {
            System.out.println(((RewriteEqHashCode) o).getId() + ((RewriteEqHashCode) o).getName());
        });
    }

}

我们同时注释RewriteEqHashCode类中equals()和hashCode()方法,测试输出结果如下:

我们只注释RewriteEqHashCode类中hashCode()方法,测试输出结果如下:

我们取消注释RewriteEqHashCode类中equals()和hashCode()方法,测试输出结果如下:

结果分析:

我们采用HashSet构造数据,其中new RewriteEqHashCode(1001, "张三")我们构造了两次,我们认为这两次是重复的数据,第一次我们同时注释equals()和hashCode()方法测试输出结果没有去重,第二次我们启用equals()方法、注释hashCode()方法测试输出结果任然没有去重,第三次我们同时开启equals()方法、hashCode()方法测试输出结果正常去重了。

因为HashSet判断对象是否相同是根据其hashCode()值比较,而equals()默认比较也是采用hashCode()。当我们什么都不重写,默认创建的对象对应的hashCode值就是不一致的;但是当我们重写equeals()时,说明我们想更改判断对象是否相等的方式,因此我们需要同时重写hashCode(),才能保证对象判断方式是我们想要的效果。这在JDK定义equals()方法时候,注释部分也有相关说明的。

特别提示:

建议大家重写equals()、hashCode()方法时候采用IDEA编辑器自动生成的,不要自己去写,因为自己去写的往往不是很严谨。

以上代码仅供参考,如有不当之处,欢迎指出!!!

更多干货,欢迎大家关注和联系我。期待和大家一起更好的交流、探讨技术!!!

 

零代码进行单细胞数据全流程分析教程 我开发的本地电脑无限使用无限分析作图的生信零代码一键分析电脑软件神器OmicsTools 软件在github上的zihaoxingstudy1/OmicsTools仓库 中,大家可以下载安装OmicsTools进行各种生信分析和可视化作图。 阅读详情

相关推荐

互联网金融项目实战(大数据Hadoop hive)

什么是互联网金融? 互联网金融 --> 信贷(信用贷款) --> 支付宝率先搞了一个信用体系 互联网金融: 在线支付、P2P 银行: 只会锦上添画、不喜欢雪中送炭 银行害怕出现坏账 ( 储户存钱,银行放贷 赚个利息差 ) 银行是可以倒闭的 保险公司不允许倒闭 银行分为:商业银行(自生自灭的)和非商业银行(国家的) 中国工商银行 全球第一大行 招商银行(清朝的一个李鸿章) 中国银行(历史超过 100 年了) 国家政策:希望银行能够扶持中小型企业 p2p:网络借贷平台 民间吸纳贷款 -->

weixin_58276266的博客 1553

重写hashcode和equals方法

一。前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄、对象头、对象实例数据、对象类型数据等也是完全一致的,所以我们可以通过比较对象的地址来判断是否相等。 二。Object源码理解 对象在不重写的情况下使用的是Object的equals方法和hashcode方法,从Object类的源码我们知道,默认的equals 判断的是两个对象的引用指向的是不是同一个对象;而hashcode也是根据对象地址生成一个

qq_42674061的博客 755

ECC密码的加密和解密(附带代码实现)

ECC,全称Elliptic Curve Cryptography,是椭圆曲线密码学。这是一种公钥加密技术,其安全性基于椭圆曲线离散对数问题,被广泛应用于信息安全领域。ECC的主要优势在于,相较于RSA和DSA等其他传统的公钥密码体系,它能够在提供相同安全级别的情况下,使用更短的密钥,从而减少计算量和存储空间的需求。例如,一个256位的ECC密钥提供的安全性可以与3072位的RSA密钥或DSA密钥相媲美。ECC的主要应用领域包括SSL安全证书、安全电子邮件、移动设备安全、物联网设备安全等。

xixixi7777的博客 8268

Object类的equal和hashCode方法重写,为什么?

往HashMap添加元素的时候,需要先定位到在数组的位置(hashCode方法)。 如果只重写了 equals 方法,两个对象 equals 返回了true,集合是不允许出现重复元素的,只能插入一个。 此时如果没有重写 hashCode 方法,那么就无法定位到同一个位置,集合还是会插入元素。这样集合中就出现了重复元素了。那么重写的equals方法就没有意义了。 如下图: ...

suncat的博客 1470

宏基因组分析|从Binning到MAG优化的全流程实战指南

本文提供了一份宏基因组分析从Binning到MAG优化的全流程实战指南。详细解析了宏基因组分箱(Binning)的核心原理与必要性,并手把手指导如何利用Bowtie2、MetaBAT2和CheckM等工具构建分箱流水线,进行质量评估与筛选,最终获得高质量宏基因组组装基因组(MAG)。文章还分享了常见问题排查与进阶优化策略,为后续物种分类、功能注释等深度分析奠定坚实基础。

weixin_29260291的博客 454

二、NovAtel Connect 2.3.2 版本 操作说明

一、连接方式 有 串口连接、USB连接、蓝牙连接、无线网连接、网口连接,具体的连接方式看博客: https://blog.youkuaiyun.com/hltt3838/article/details/110622732 下面具体的介绍一下 串口的连接方式: 接收机有三个串口,COM1、COM2、COM3,看上面的连接就知道了! 并且有三个对应的线,1 2 3 ; 把线和串口对应连接,串口的另一端和电脑连接,当然如果电脑没有串口,可以用 串口转USB,如线图所示: (当然,一定要连接电源呀) ...

努力努力努力 4382

IDEA中快捷为类重写equals和hashCode方法

如果不重写本方法默认对比的是对象内存地址 所以要在方法里面重写方法public boolean equals(Object obj){ //代码段,一般对比对象里面的变量即可 //以及对比一些函数巴拉巴拉 }如果是说重写了的equals方法,最好重写hashCode方法 IDEA中,可以在类中使用右键,Generate进行方法重写,十分方便 重写后进行类的对比,即可显示为t

applek_Case的博客 2万+

cesium加载geotiff的 四种方法

本文介绍了在Cesium中加载GeoTIFF数据的两种主要方法。首先解析了核心前置知识,包括坐标系匹配、数据类型区分和性能优化。方法1详细演示了如何将RGB影像GeoTIFF转换为Cesium影像图层,包含从数据解析到Canvas转换的完整代码流程。方法2则针对高程数据(DEM)处理,展示了前端直接解析构建地形网格的方案。文章提供了完整的代码示例和关键实现要点,适用于卫星影像、专题图和数字高程模型等多种GeoTIFF数据类型在三维场景中的可视化需求。

大剑师兰特的GIS世界 392

站稳马步——(1)重写 equals 和 hashCode 方法

尽管Object是一个具体的类,但是设计它主要是为了扩展。它所要的非final方法(equals hashCode toString clone和finalize)都有通用约定(general contract),因为它们被设计成要被覆盖(override)的。任何一个类,它在覆盖这些方法的时候,都有责任遵守这些通用的约定;如果不能做到这一点,其它依赖这些约定的类(例如HashMap和HashSet)就无法结合该类一起正常运行。

终日思 < 须臾学 1991

LightGBM之LGBMRegressor()参数详解以及调参

LightGBMLight Gradient Boosting Machine)是一种梯度提升框架,它使用决策树作为基学习器。LightGBM 可以说是在 XGBoost 上做的优化。LightGBM 为高效并行计算而生,它的 Light 体现在以下几个点上:更快的训练速度更低的内存使用支持单机多线程,多机并行计算,以及 GPU 训练能够处理大规模数据。

我走的每一步都算数 3745

Linux | i.MX6ULL Mqtt 移植教程

本文介绍了MQTT协议在物联网中的应用及其实现工具Mosquitto的移植过程。使用Ubuntu 16.04环境和gcc交叉编译器,详细说明了从X86平台安装测试到ARM开发板移植的完整步骤。重点包括:Mosquitto的安装配置、服务启动测试方法、依赖库openssl和libuuid的交叉编译过程、路径参数修改要点,以及最终在开发板上的功能测试验证。文中提供了具体的命令操作和路径修改示例,强调路径一致性对编译成功的重要性。该移植方案实现了轻量级MQTT协议在嵌入式设备中的应用。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 138

为什么要同时重写hashcode和equals方法之简单理解

1.如果两个对象用equals不等,则hashcode必不相同因为爱情。我们知道set集合是不允许元素重复的,那怎么保证不重复呢。用equals方法就够了呀。但是一旦数据量很大,那一个对象去和集合里对象比较的时候,每次都要调用equals方法,而equals方法的实现是通过==实现的,即比较地址,地址是要访问底层才能拿到的,所以行效率低。 那怎么解决呢?就是重写hashcode方法,而hashcode是自己生成的,不用访问底层,这个可以查看String的源码, 我每次比较的时候,先比较hashCode,如

YW博客 356

在 SAP S/4HANA 的 BP 事务里做保存前校验:BDT 事件、BUPA_FURTHER_CHECKS 与 CVI 扩展 BAdI 一次讲透

SAP BP事务保存前校验机制解析 摘要:本文系统梳理了SAP BP事务保存前的校验机制,揭示了三种关键校验点的差异与适用场景: BDT框架DCHCK事件:最靠近UI层,适合屏幕字段级校验,但API调用时可能失效 Classic BAdI BUPA_FURTHER_CHECKS:全局拦截点,可阻断整个BP保存,适合核心业务规则 CVI扩展校验:仅管控供应商/客户段落,需注意可能产生"BP已保存但段落未保存"的情况 文章通过真实案例(如黑名单校验、付款冻结等)展示了各校验点的最佳实践,并特

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 305

一文让你搞懂:为什么重写equals方法的时候要同时重写hashCode方法

在Java中,重写equals方法时通常需要同时重写hashCode方法,以确保对象在基于哈希表的集合(如HashMap、HashSet)中能够正确工作。hashCode方法用于生成对象的哈希码,而equals方法用于判断两个对象是否相等。根据规则,如果两个对象通过equals方法判断为相等,它们的hashCode值也必须相等。如果只重写equals方法而不重写hashCode方法,可能会导致哈希集合无法正确去重,因为集合在判断对象是否相等时,首先比较的是哈希码,只有在哈希码相等时才会调用equals方法。

一位想要成为优秀全栈工程师的有志青年! 1193

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

为什么重写equals方法的同时也要重写hashcode方法

为什么重写equals方法的同时也要重写hashcode方法 注:JDK版本:1.8.0_251 首先,我们来看一下在Object类中,这两个方法是是干嘛的,现贴出代码: 在Object类中, equals方法进行相等比较,是用 == 号对两个对象进行比较。我们知道,在Java中,==比较,其实比较的是两个对象的hashcode, 我们再看看Object类的hashCode()方法: 这个方法呢,它是一个native方法,这个方法会返回当前对象的哈希散列码。 OK,现在打完了Object类的铺垫,我们再

喝点江小白 784

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

为什么需要同时重写equals方法和hashCode方法

在 Java 中,同时重写equals和hashCode方法是非常重要的。通过正确实现这两个方法,可以确保对象的相等性比较和哈希表功能的正常运行,遵循 Java 的规范和契约,减少代码的复杂性和维护成本。重写这两个方法时,需特别注意它们的关系,确保equals和hashCode一致,以保证对象在哈希表等数据结构中的正确使用。

m0_63845908的博客 1162

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

为什么重写equals方法需同时重写hashCode方法?

1. 为什么要重写equals()方法? 因为object中的equals()方法比较的是对象的引用地址是否相等,如何你需要判断对象里的内容是否相等,则需要重写equals()方法。 2. Java中有哪些类重写了equals()方法? java中的大部分类都重写了equals()方法,没有重写的类大部分都是自己定义的类,比如说自己定义了一个Person 类,这个就没有重写equals()方法。 ...

总结经验,与君共勉 436

为什么重写equals方法同时一定要重写hashCode方法

问题:为什么重写equals方法一定要同时重写hashCode方法? 首先抛出答案:这和集合的某些操作有关(比如HashSet的add方法) HashSet add(E e) 方法如下: public boolean add(E e) { return map.put(e, PRESENT)==null; } 复制代码在HashSet的内部维护了一个HashMap,可以看到对于H...

weixin_34342905的博客 253

java中重写equals()方法为什么要同时重写hashcode()方法?

1.为什么要重写equals()方法? 因为object中的equals()方法比较的是对象的引用地址是否相等,如何你需要判断对象里的内容是否相等,则需要重写equals()方法。 2.Java中有哪些类重写了equals()方法? java中的大部分类都重写了equals()方法,没有重写的类大部分都是自己定义的类,比如说自己定义了一个person类,这个就没有重写equals()方法。 3.h...

liuxingdeyun的博客 1万+

为什么重写equals()方法的同时要重写hashCode()方法

原文地址:https://www.jianshu.com/p/3819388ff2f4 equals方法和hashCode方法都是Object类中的方法,我们来看看他们的源码: public boolean equals(Object obj) { return (this == obj); } public native int hashCode(); 可知,...

小名同学 21万+

为什么在Java中重写equals()方法同时要重写hashcode()方法

  要彻底了解透为什么重写equals()方法同时要重写hashcode()方法,我们不妨先来看看这样一个例子: String a=new String("123"); String b=new String("123"); System.out.println(a==b); //false System.out.println(a.equals(b)); //true System.out.println(a.h

CY2333333的博客 452

HashMap为什么要同时重写hashCode和equals方法

今天说说HashMap为什么要同时重写hashCode和equals方法 , 为什么不只重写hashCode或者只重写equals呢 ? 算是自己也写个笔记记录记录吧 ! 首先是hashmap的put方法 , 这个put方法的过程一定是要保证hashmap的键值对的唯一性 、 键的唯一性 。 hashmap 初始化的时候是一个table 数组 , 默认是16大小 , 然后如果有了ha...

asd991543753的博客 1200

为什么要同时重写equals和hashcode方法

现在有两个Student对象: Student s1=new Student("小明",18); Student s2=new Student("小明",18); 此时s1.equals(s2)一定返回true (注意,以下是关于hashcode的一些规定: 两个对象相等,hashcode一定相等 两个对象不等,hashcode不一定不等 hashcode相等,两个对...

u012133048的博客 5999

重写equals方法同时需要重写hashcode方法

HashMap以自定义的类作为键 import java.util.HashMap; import java.util.Map; class Key { String title; public Key(String title) { this.title = title; } } public class HashMapLeakDemo { public static void main(String[] args) { Map<

qq_45451226的博客 388

Java:为什么重写 equals 方法时必须同时重写 hashCode 方法?

本文由 Java 中常见的面试题「为什么重写 equals 方法时必须同时重写 hashCode 方法?」所引出。渐进式探讨关于 hashCode 的三个问题:hashCode 方法的作用以及 hashCode 方法与 equals 方法的关系?为什么重写 equals 方法时必须同时重写 hashCode 方法?以及如何重写 hashCode 方法?

leileiluoluo的博客 385

java基础:JAVA中重写equals()方法的同时要重写hashcode()方法

hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的次数。

maligebilaowang的博客 1494
上一篇: CopyOnWriteArrayList源码分析、使用场景说明
下一篇: 并发编程之LockSupport源码分析及简单使用
饶艳辉
博客等级 码龄15年 20粉丝 46原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值