当前位置: 首页 > news >正文

Java 中 hashCode 和 equals 方法是什么?它们与 == 操作符有什么区别?

Java 中 hashCode 和 equals 方法详解

1. equals 方法

equals()方法用于判断两个对象是否逻辑相等

默认实现

// Object 类中的默认实现publicbooleanequals(Objectobj){return(this==obj);}

重写 equals 的规范

@Overridepublicbooleanequals(Objectobj){// 1. 自反性:x.equals(x) 必须返回 true// 2. 对称性:x.equals(y) 和 y.equals(x) 结果必须一致// 3. 传递性:x.equals(y) && y.equals(z) 则 x.equals(z)// 4. 一致性:多次调用结果一致// 5. 非空性:x.equals(null) 必须返回 falseif(this==obj)returntrue;// 引用相同if(obj==null||getClass()!=obj.getClass())returnfalse;MyClassother=(MyClass)obj;returnObjects.equals(field,other.field);}

2. hashCode 方法

hashCode()返回对象的哈希码(整数),用于哈希表(HashMap、HashSet 等)快速定位对象。

重要规则

  • 一致性:多次调用 hashCode() 应返回相同整数(对象未修改时)
  • equals 相等则 hashCode 相等:如果a.equals(b)为 true,则a.hashCode() == b.hashCode()
  • hashCode 相等不一定 equals 相等:哈希冲突是允许的

重写 hashCode 示例

@OverridepublicinthashCode(){returnObjects.hash(field1,field2,field3);}

3. == 操作符

==引用比较,判断两个对象的内存地址是否相同。

Strings1=newString("hello");Strings2=newString("hello");System.out.println(s1==s2);// false(不同对象)System.out.println(s1.equals(s2));// true(内容相同)

4. 三者对比

特性==equals()hashCode()
比较内容内存地址逻辑内容哈希值
Object 默认引用比较引用比较内存地址转换
可重写不可
返回类型booleanbooleanint
主要用途判断是否同一对象判断内容是否相等哈希表索引

5. 实际应用示例

publicclassPerson{privateStringname;privateintage;@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null||getClass()!=obj.getClass())returnfalse;Personperson=(Person)obj;returnage==person.age&&Objects.equals(name,person.name);}@OverridepublicinthashCode(){returnObjects.hash(name,age);}}// 使用示例Personp1=newPerson("张三",25);Personp2=newPerson("张三",25);System.out.println(p1==p2);// falseSystem.out.println(p1.equals(p2));// trueSystem.out.println(p1.hashCode()==p2.hashCode());// true// 在 HashSet 中使用Set<Person>set=newHashSet<>();set.add(p1);set.add(p2);// 不会重复添加,因为 equals 相等System.out.println(set.size());// 1

6. 关键要点

  1. 必须同时重写:重写equals()时必须重写hashCode()
  2. 哈希表依赖:HashMap、HashSet 等集合依赖这两个方法
  3. String 类:已重写这两个方法,比较字符串内容
  4. 包装类:Integer、Long 等也已重写
  5. 性能考虑:hashCode 计算应快速且分布均匀

理解这三个概念对于正确使用 Java 集合框架和编写健壮的代码至关重要!

http://www.jsqmd.com/news/394866/

相关文章:

  • 《计算机是怎样跑起来的》————让写算法跟呼吸一样简单
  • 购物卡回收的三种热门方法整理 - 京回收小程序
  • ChatPPT Nano Banana Pro · Magic模式深度解析 ——重新定义“所想即所得”的PPT智能编辑
  • ARM Cortex-A7(IMX6ULL)嵌入式裸机开发指南:从点灯到中断 - 实践
  • 大润发购物卡回收靠谱的3个主流渠道 - 京回收小程序
  • 天猫超市购物卡回收常见三种方法及流程解析 - 京回收小程序
  • 最近在调试西门子808D数控系统的机械手刀库,整个过程虽然有点复杂,但还挺有意思的。今天就来分享一下我的调试经验,顺便贴点代码,希望能帮到有需要的朋友
  • 镜像孪生驱动的视频孪生升级版水利电力三维态势控制中枢白皮书---依托矩阵视频融合架构、统一三维坐标基准构建技术、动态误差修正模型与风险交汇时间解算算法形成的空间级前向布控平台-
  • 2026年公司起名机构推荐榜单:十大专业品牌深度测评,企业选型必看 - 博客万
  • 视频孪生之上,是镜像孪生镜像视界三维空间控制作战体系---基于镜像视界(浙江)科技有限公司矩阵视频融合、Pixel-to-3D 反演引擎、三维轨迹建模体系与趋势级风险推演算法构建的全域主动压制平
  • 从春晚舞台到万家灯火:菁彩Vivid三度携手央视频,以沉浸体验点亮中国年 - 博客万
  • 6大方法禁止win11自动更新
  • 进口维生素d3十大品牌揭晓,维生素d3哪个牌子成分安全?复配K2,锁钙护血管更安心 - 博客万
  • 免费招聘平台TOP榜盘点,前三名免费查看简历 - 博客万
  • 目前最靠谱的招聘网站?2026权威测评与真实口碑 - 博客万
  • 【Docker高级篇】吃透Docker CI/CD集成:从代码提交到镜像部署,一步到位不踩坑
  • 【Docker高级篇】吃透容器编排:Swarm vs K8s 核心差异,为后续K8s学习打牢基础
  • 【Docker高级篇】新手也能懂的应用安全:为什么不能用root?镜像怎么扫漏洞?
  • 大数据架构数据流水线:从采集到分析的完整设计
  • 基于博途1200PLC + HMI病床呼叫控制系统仿真探索
  • A2UI协议,打破Agent交互壁垒,让智能系统自主“搭建”界面 - 指南
  • YOLO26涨点改进 | 独家创新,注意力改进篇 | AAAI 2025 | YOLO26引入 DRM 防御优化模块,进行特征优化/特征增强,助力目标检测、图像分类、图像分割有效涨点
  • dokuwikiAPI 探索器
  • 哨兵机制(sentinel)的原理
  • Redis客观下线
  • 一文搞懂超详细ubuntu22.04部署k8s1.28高可用(一)【多master+keepalived+nginx实现负载均衡】:核心原理+实战案例
  • 61 二分查找
  • 解决DokuWiki JSONRPC 403错误
  • COMSOL 两相流 THM 热流固耦合模型:探索与实践
  • 探索基于Matlab的虚拟同步电机并网控制仿真之旅