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

Java中的equals()与hashCode()

1. equals()方法与 hashCode()方法之间的约定

假设有两个对象A和B:

  • 如果 A.equals(B) == true,那么 A.hashCode() 与 B.hashCode() 必须相等
  • 如果 A.equals(B) == false,那么 A.hashCode() 与 B.hashCode() 不一定相等
  • 如果 A.hashCode() 与 B.hashCode() 相等,A.equals(B) 返回值不一定为 true
  • 如果 A.hashCode() 与 B.hashCode() 不相等,那么 A.equals(B) 一定为 false

为了保证 .equals() 和 hashCode() 方法之间的维持上述约定,重写 .equals() 方法时,必须同时重写 hashCode() 方法。虽然违反上述约定,编译和运行时都不会报错,但是在一些场景会出现逻辑错误。

2. hashCode() 的作用

  • hashCode() 方法的核心作用是:为对象生成一个整数,用来加速在哈希结构(HashMap、HashSet、Hashtable 等)中的查找和存储。

为什么 hashCode() 和 equals() 需要保持一致?​​

  • 场景 1​​:如果 A.equals(B) == true,那么它们应该被视为逻辑上相等的对象。此时二者的 hashCode() 必须返回相同的值,否则在使用 HashMap/HashSet 等基于哈希的集合时,可能会被放入不同的哈希桶中,导致相同的对象被存储多次,违反集合的唯一性要求。

  • ​​场景 2​​:如果 A.equals(B) == false,它们的 hashCode() 可以相同(哈希碰撞)。这种情况下,它们会被放入同一个哈希桶中,但最终会通过 equals() 方法确认它们是不同的对象。

// 在下面这段代码中,如果重写了.equals() 却没重写 hashCode(),结果会是false
class Student {String id;Student(String id) { this.id = id; }@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Student)) return false;Student s = (Student) o;return id.equals(s.id);}// 重写 hashCode()// @Override// public int hashCode() {//    return Objects.hash(id);//}
}public class TestMain {public static void main(String[] args) throws IOException {HashSet<Student> set = new HashSet<>();set.add(new Student("1001"));// 结果是 falseSystem.out.println(set.contains(new Student("1001")));}
}

总结

hashCode() 给对象生成一个整数,用来加速哈希容器(比如 HashMap)的存取。Java 规定:如果两个对象通过 .equals() 相等,它们的 hashCode() 必须一样,否则哈希结构会出错;但反过来,hashCode() 一样,不代表 .equals() 就相等。

http://www.dtcms.com/a/392260.html

相关文章:

  • 【绕过open_basedir】
  • 如何用户细分
  • 福彩双色球第2025109期篮球号码分析
  • 思考:客户端负载均衡和服务器负载均衡有什么区别?
  • 网络编程day04/05原始套接字
  • Yarn命令与npm命令的区别与联系(npm:Node.js的官方包管理工具;Yarn:Facebook开发的JavaScript包管理工具)
  • 【大语言模型 67】梯度压缩与稀疏通信
  • LeetCode第365题_水壶问题
  • OpenCV:DNN 模块实现图像风格迁移
  • 锤子助手插件功能六十四:禁用视频前置摄像头镜像
  • OpenHarmony NFC Tag驱动深度剖析:从HDF框架到NDEF读写全流程实战
  • 黑马头条_SpringCloud项目阶段四:多媒体短文章提交功能实现详解
  • TraceID串联数据孤岛:勤源全链路可观测性平台破解微服务“黑箱困境”
  • 随机梯度下降(SGD)算法及其在机器学习中的应用
  • 趣谈bug - the Norway problem
  • $attrs 和 $listeners 的使用场景和用法是什么?
  • [Linux]学习笔记系列 -- lib/radix-tree.c 基数树(Radix Tree) 整数键到指针的高效映射
  • Scikit-learn Python机器学习 - 回归分析算法 - 线性回归 (LinearRegression SGDRegressor)
  • ts的内置工具类型
  • 扫地车:守护多元场景的清洁 “多面手”
  • 力扣 136.只出现一次的数字
  • 【序列晋升】38 Spring Data MongoDB 的统一数据访问范式与实践
  • 如何将枯燥的大数据呈现为可视化的图和动画?
  • 前后端分离架构下,如何安全存储和使用 API 密钥?
  • Nano 编辑器快捷键
  • 《智能体教程》——如何构建多智能体系统:开发者实用指南
  • 小杰机器学习高级(three)——逻辑回归、二分类算法
  • Spring注解驱动开发:从XML到注解的完美蜕变
  • 【Spring AI】第三弹:深入解析 RAG 核心特性、关键流程、基于 Spring AI + 知识库实现 RAG 检索增强器
  • 【剪映】官方下载方式?【图文详解】电脑版下载?正版安全下载?最新版下载?