如何正确的重写equals() 和 hashCode()方法

为什么重写equals()方法时,必须要求重写hashCode()方法? equals() 方法和 hashcode() 方法是 java.lang.Object 类的两个重要的方法,Java中多数类都会重写 Object 类的 equals() 方法。 在实际应用中,如果我们自定义的类需要进行比较操作,就一定也需要重写 equals() 方法。那么为什么重写 equals()方法时,必须要求重写 hashCode() 方法呢? 首先, equals() 方法和 h... 阅读详情

本文将介绍在java中如何重写equals 和hashCode方法。

---译自:http://www.mkyong.com/java/java-how-to-overrides-equals-and-hashcode/

比较两个Java对象时, 我们需要覆盖equals和  hashCode。

[java]  view plain  copy
  1. public class User{      
  2.     private String name;  
  3.     private int age;  
  4.     private String passport;  
  5.   
  6.     //getters and setters, constructor  
  7. }  

在比较结果时:
[java]  view plain  copy
  1. User user1 = new User("mkyong", 35, "111222333");  
  2. User user2 = new User("mkyong", 35, "111222333");  
  3.   
  4. System.out.println(user1.equals(user2)); // false  

下面我们将介绍几种常用方法:

 1.经典方式

这种17和31散列码的想法来自经典的Java书籍——《Effective Java》第九条。下面我们来看看是如何实现的...
[java]  view plain  copy
  1. public class User {  
  2.     private String name;  
  3.     private int age;  
  4.     private String passport;  
  5.     //getters and setters, constructor  
  6.     @Override  
  7.     public boolean equals(Object o) {  
  8.         if (o == this) return true;  
  9.         if (!(o instanceof User)) {  
  10.             return false;  
  11.         }  
  12.         User user = (User) o;  
  13.         return user.name.equals(name) &&  
  14.                 user.age == age &&  
  15.                 user.passport.equals(passport);  
  16.     }  
  17.     //Idea from effective Java : Item 9  
  18.     @Override  
  19.     public int hashCode() {  
  20.         int result = 17;  
  21.         result = 31 * result + name.hashCode();  
  22.         result = 31 * result + age;  
  23.         result = 31 * result + passport.hashCode();  
  24.         return result;  
  25.     }  
  26. }  

2.JDK 7

对于JDK7及更新版本,你可以是使用java.util.Objects 来重写 equals 和 hashCode 方法,代码如下

[java]  view plain  copy
  1. import java.util.Objects;  
  2.   
  3. public class User {  
  4.     private String name;  
  5.     private int age;  
  6.     private String passport;  
  7.   
  8.     //getters and setters, constructor  
  9.   
  10.     @Override  
  11.     public boolean equals(Object o) {  
  12.         if (o == this) return true;  
  13.         if (!(o instanceof User)) {  
  14.             return false;  
  15.         }  
  16.         User user = (User) o;  
  17.         return age == user.age &&  
  18.                 Objects.equals(name, user.name) &&  
  19.                 Objects.equals(passport, user.passport);  
  20.     }  
  21.   
  22.     @Override  
  23.     public int hashCode() {  
  24.         return Objects.hash(name, age, passport);  
  25.     }  
  26.   
  27. }  

3.Apache Commons Lang

或者,您可以使用Apache Commons LangEqualsBuilder 和HashCodeBuilder 方法。代码如下
[java]  view plain  copy
  1. import org.apache.commons.lang3.builder;  
  2.   
  3. public class User {  
  4.     private String name;  
  5.     private int age;  
  6.     private String passport;  
  7.     //getters and setters, constructor  
  8.   
  9.      @Override  
  10.     public boolean equals(Object o) {  
  11.   
  12.         if (o == this) return true;  
  13.         if (!(o instanceof User)) {  
  14.             return false;  
  15.         }  
  16.         User user = (User) o;  
  17.   
  18.         return new EqualsBuilder()  
  19.                 .append(age, user.age)  
  20.                 .append(name, user.name)  
  21.                 .append(passport, user.passport)  
  22.                 .isEquals();  
  23.     }  
  24.     @Override  
  25.     public int hashCode() {  
  26.         return new HashCodeBuilder(17, 37)  
  27.                 .append(name)  
  28.                 .append(age)  
  29.                 .append(passport)  
  30.                 .toHashCode();  
  31.     }  
  32. }  

最后测试总结:

在使用上述三种任何一种方式都可以到如下结果:
[java]  view plain  copy
  1. User user1 = new User("mkyong", 35, "111222333");  
  2. User user2 = new User("mkyong", 35, "111222333");  
  3. System.out.println(user1.equals(user2)); // true</span>  

其实后两种都是对于17和31散列码思想的封装实现。具体请参考《Effective Java》第九条。
SpringBoot+Git+Jenkins+K8s容器化部署 SpringBoot+Git+Jenkins+K8s容器一套部署流程 阅读详情

相关推荐

Discrete Optimization (Coursera) 学习笔记 Week 1 introduction (开个帖子)

Week 1 Introduction 这位教授Pascal Van Hentenryck 真的算是优化领域神级别的人物了吧?截一张Google scholar的图大家感受一下… 居然在Coursera上看到了他开的课:Discrete Optimization。试听了几节后,发现讲得很有激情,而且深入浅出。遂决定花暑假跟完这一门课。 这门课每周花两三个小时介绍基础概念,然后得花十几个小时写作业(coding)… 一开始以为Coursera上的课的作业应该不会太难,然后第一次作业(knapsack)我就被

ZJ_11701的博客 656

【Java基础】重写equals方法详讲

重写equals方法 【Java比较学习】重写equals方法的安全写法 重写equals方法的两种方式 这里提供两个比较常见的equals重写方法: ● 用instanceof实现重写equals方法 ● 用getClass实现重写equals方法 先说结论,getClass()比instanceof更安全。接下来就是我们自己要来实现equals方法了。 场景描述 假设有此场景: 在已经创建好的长方形类中重写Object类中的equals方法为当长方形的长和宽相等时,返回TRUE,同时重写hashCode

qq_43783527的博客 2万+

MacBook用户必看:用Homebrew一键搞定frp内网穿透(含阿里云配置模板)

本文为MacBook用户提供基于Homebrew的frp内网穿透实战指南,详细介绍了从环境准备到阿里云服务器配置的全过程。通过Homebrew一键安装frp客户端,结合阿里云配置模板,实现高效稳定的内网穿透,适用于远程开发、IoT设备调试等多种场景。

weixin_28692817的博客 321

重写HashCode与equal方法

一、为什么要重写hashCode与equal 1.判断两个或多个引用类型的值相等的条件: 1.1 条件1:引用类型的地址相等(充分而不必要); 1.2 条件2:引用类型的值相等(充分必要) 2.引用类型数据: 除了8种基本数据类型以外的数据; 引用类型一般都是通过new关键字创建对象,然后把这个对象赋予给相应的变量,最常用的引用类型是String类型,它也比较特殊,可以直接通过关键字new来创建对象,也可以通过字符串直接赋值,比如: Stri...

zyh661120的博客 5208

sklearn2pmml xgboost缺失值(missing)处理的坑

sklearn2pmml xgboost缺失值(missing)如何处理 今天同事在部署xgboost pmml模型时遇到了大坑,线上spark预测和本地python预测结果怎么都不对应,记录一下处理过程。 看了下同事的代码,貌似也没有问题 from sklearn2pmml import PMMLPipeline from sklearn2pmml import sklearn2pmml fro...

Skycrab 8969

【Konva】解决图形加入group后无法获取到绝对坐标,以及group内绘制新图形坐标偏移的问题

解决konva绘图开发时“图形加入group后坐标不会变动,无法获取到绝对坐标”的问题

近10年前端开发工作经验,为你分享日常经验所得 1499

重写equals()必须重写hashcode()【重点】

Java 重写equals方法必须重写hashcode方法简介原生equals与hashcode方法equals()方法hashcode()方法为什么需要重写equals和hashCode方法?结语   同学们,今天我们来了解一个热点问题,初学者可能对这个问题比较难理解,通过本文的学习,你能够清晰的理解问什么重写了equals方法就必须得重写hashcode方法。 简介 原生equals与hashcode方法   equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用

ᶻᶻᶻ 枕星河的博客 2720

STM32 SAI接口实战:用CubeMX快速配置多通道音频采集(附DMA优化技巧)

本文详细介绍了如何使用STM32的SAI接口通过CubeMX快速配置多通道音频采集系统,并提供了DMA双缓冲优化技巧。内容涵盖TDM模式配置、时钟同步、DMA优化及常见问题排查,帮助开发者高效实现高速数据采集应用。

weixin_42549037的博客 225

重写hashcode和equals方法

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

qq_42674061的博客 755

Unity Shader变体优化实战:从内存削减到打包加速

本文深入探讨了Unity项目中Shader变体数量爆炸导致的打包缓慢、内存占用过高及包体臃肿等问题。核心解决方案是通过精准的Shader变体裁剪,即收集项目实际用到的变体形成“白名单”,并利用IPreprocessShaders接口在打包时剔除无用变体。实战表明,该方法能显著提升打包速度并大幅降低运行时内存。

weixin_29300241的博客 217

Transformer模型在语义通信中的实战应用:从信源编码到端到端优化

本文深入探讨了Transformer模型在语义通信中的实战应用,从信源编码到端到端优化。文章分析了Transformer凭借其强大的全局依赖建模能力,如何成为实现高效语义提取与传输的理想架构,并提供了构建可端到端训练系统的具体实现思路与评估方法,旨在为下一代智能通信系统提供技术参考。

o9p0q1的博客 691

重写hashcode 与 equals方法

文章目录重写hashcode 与 equals方法Why同时重写:1. 不重写的情况:1.1 两者关系2. 只重写equals的情况:2.1 不重写导致的结果案例: 重写hashcode 与 equals方法 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false;

一年半 1631

【2025年华为秋招(AI)-11月19日-第二题(200分)- 终端款型聚类识别】(题目+思路+Java&C++&Python解析+在线测试)

该摘要总结了题目要求、输入输出格式、KMeans算法的实现步骤以及关键点。以下是150字内的摘要: 本文提出基于KMeans算法对终端型号进行聚类的方法。通过包间隔时长、连接持续时长、漫游前后信号强度4个特征,使用欧氏距离度量相似度。算法采用固定初始化策略(前k个样本作为初始质心),经过分配-更新迭代,直至质心移动小于1e-8或达到最大迭代次数。最终输出各簇样本数并按升序排列,解决了终端型号自动分类问题。示例显示该方法能有效识别3-4类终端,并准确统计每类数量。

m0_73659489的博客 141

Java 必看:如何正确重写 hashCode() 和 equals() 方法?

同时重写:总是同时重写equals()和hashCode()方法使用工具类:优先使用和包含所有关键字段equals()和hashCode()应该基于相同的字段集合保持一致性:确保两个方法基于不可变或很少变化的字段考虑性能:在equals()方法中,先比较最可能不同的字段或计算成本低的字段重写toString():虽然不是必须,但好的toString()方法有助于调试使用IDE生成:现代IDE(IntelliJ IDEA、Eclipse)可以生成高质量的equals()和hashCode()方法。

2501_94116301的博客 304

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java如何正确重写hashCode()和equals()方法

hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equals()方法 如果你决定要重写equals()方法,那么你一定要明确这么做所带来的风险,并确保自己能写出一个健壮的equals()方法.一定要注意的一点是,在重写equals()后,一定要重写has

XuJiangDong 630

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JAVA中重写equals()方法的同时要重写hashcode()方法

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true; 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定...

测试0901-1 131

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

为什么重写equals()方法就必须重写hashCode()方法呢?

文章目录前言一、equals和==二、hashCode()方法三、hashCode() 与 equals()1.不会创建“类对应的散列表”,不存在重写equals()要重写hashCode()2.当类需要放在HashTable、HashMap、HashSet等hash结构的集合时需要重载hashCode()总结 前言 对于Java开发或者Android开发的小伙伴来说,在面试的时候,应该都会遇到面试官问这么一个问题:你知道equals()和 == 的区别在哪嘛?小伙伴的第一反应一般都会是回答:equal

你的外祖父的博客 919

谈谈如何重写equals()方法?为什么还要重写hashCode()?

类中的两个重要方法,它们在对象比较和哈希表操作中起着关键作用。操作符比较对象的内存地址,但这通常不符合我们对“相等”的定义。因此,当设计自己的类时,通常需要重写。方法用于计算对象的哈希码(一个整数值),主要用于哈希表的存储和查找(如。方法返回对象的内存地址的哈希值,但这通常不符合我们对“相等”的定义。方法相等,它们也可能被存储在哈希表的不同位置,从而导致查找失败。方法时,只要对象的字段值未改变,结果必须一致。方法保持一致,确保相等的对象具有相同的哈希值。对于类中的每个字段,逐一比较它们的值是否相等。

dangaodeaiyi的专栏 1349
上一篇: HashMap实现原理
下一篇: 梁冬一席演讲:人生的最高境界是“不二”
木木那年
博客等级 码龄12年 37粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值