首页 > 其他分享 >hashCode 和 equals方法

hashCode 和 equals方法

时间:2024-05-22 20:52:05浏览次数:23  
标签:相等 对象 equals hashCode 哈希 方法

 

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

 在 Java 中,equals 和 hashCode 方法的合同(contract)规定:

  (1) 如果两个对象根据 equals 方法是相等的,那么它们的 hashCode 值必须相同。  

  (2) 如果两个对象根据 equals 方法是不相等的,那么它们的 hashCode 值不一定不同。

  这是因为哈希表(如 HashMap 和 HashSet)使用 hashCode 来确定对象的存储位置。如果只重写 equals 而不重写 hashCode,可能会违反这个合同,导致集合在存储和查找对象时出现问题。

  • 哈希存储: 当将对象添加到 HashSet 或 HashMap 中时,集合会首先计算对象的 hashCode 值,以确定其存储的桶(bucket)。
  • 冲突处理: 如果两个对象的 hashCode 值相同,集合会使用 equals 方法来确定它们是否确实是相同的对象。

2. hashCode 和 equals方法联系。

  (1) 如果两个对象通过 equals 方法比较是相等的,那么它们的 hashCode 值一定相等。

    • 这是 Java 的 hashCode 合同要求的。这保证了在哈希表中相等的对象会被放在同一个桶中。

  (2) 如果两个对象的 hashCode 值相等,它们不一定是通过 equals 方法比较相等。

    • 因为不同的对象可以有相同的 hashCode 值(哈希碰撞)。

  (3) 如果两个对象通过 equals 方法比较是不相等的,它们的 hashCode 值可能相等。

    •  这是由于哈希碰撞,即不同的对象可能有相同的 hashCode 值。

  (4) 如果两个对象的 hashCode 值不相等,它们一定通过 equals 方法比较是不相等的。

    •  如果 hashCode 不相等,equals 一定不会认为它们相等。这是因为 hashCode 是先验条件,只有 hashCode 相等时才有可能进一步通过 equals 比较。

 

 

标签:相等,对象,equals,hashCode,哈希,方法
From: https://www.cnblogs.com/warmNest-llb/p/18207053

相关文章

  • unity中animator中Trigger多次触发动画的解决方法(基于 stateInfo和ResetTrigger)
    巧妙地重置動畫控制器觸發(ResetTriggers)_哔哩哔哩_bilibili提出了FSMCleaSignals,会在进和出动画时使相关的trigger变为非激活状态,但是当该动作涉及多layer/多trigger控制时,会在该layer中动作未完成时,其他layer读取到了还未更改的异常激活状态的trigger,从而出错,这种错误主要是......
  • Java:如何轻松获取当前执行的方法名
    哈喽,大家好,我是木头左!在编程的世界里,经常会遇到各种各样的问题。有时候,需要了解当前执行的方法名,以便更好地调试代码或者记录日志。那么,如何在Java中轻松获取当前执行的方法名呢?本文将为您揭示这个神秘的技巧!一、Java方法的执行上下文在Java中,每个方法都有一个与之关联的执行......
  • 这四种EPUB转PDF的方法你一定要看看
    EPUB是一种流行的电子书格式,而PDF则是一种广泛应用于文件共享和打印的格式。有时,我们可能需要将EPUB格式的电子书转换为PDF格式,以便于在不同设备或平台上阅读或打印。那么如何将epub格式转换为pdf格式呢?本文将为您介绍四种将EPUB格式转换为PDF格式的方法,帮助您轻松实现格式转换。......
  • Java RMI遇到的Connection refused to Host: 127.x.x.x/192.x.x.x/10.x.x.x问题解决方
    问题故障解决记录--JavaRMIConnectionrefusedtohost:x.x.x.x....在学习JavaRMI时,我遇到了以下情况问题原因:可能大家的host是10或者192的私有地址,我估计都是和我一样的一个原因:/etc/hosts文件的配置问题(我是ubuntu系统下的实验环境),也就是主机名称和IP地址的映射关系......
  • 从立创导出元件原理图、封装、3D模型到AD的方法
    1.导出原理图搜索器件并点击数据手册再点击立即打开原理图里面点击导出AD,即可下载原理图文件将下载文件用AD打开,并生成原理图库将生成的原理图库文件复制到自己的原理图库即可2.导出PCB步骤同上,不再赘述3.导出3D模型这里就不能用网页版立创,在软件立创EDA里面先随便......
  • 技嘉主板设置U盘启动安装系统方法
    博主以H410MS2为例 开机后按F2键进入BIOS设置界面。 使用左右移动按键找到Boot选项。在Boot选项内找到CSMSupport栏位,将Disabled(关闭)选项改为Enabled(启用)如图所示。 在下面选项栏位找到OtherPCIdevices,将UEFI改为Legacy,按F10保存退出。 开机后按F12选择对应的U盘......
  • SQL Server常用方法【未完】
    判断字符串是否包含某个字符串--函数:CHARINDEX--通过CHARINDEX如果能够找到对应的字符串,则返回该字符串位置,否则返回0--基本语法如下:--CHARINDEX(expressionToFind,expressionToSearch[,start_location])-- expressionToFind:目标字符串,就是想要找到的字符......
  • thinkphp5遇到必须使用Db::raw方法而无法使用json格式传递Db对象
    今天使用Thinkphp5做异步任务传递where参数时遇到一个问题:有一段如下代码:$where['jst.supplier']=['exp',Db::raw('>0orjst.is_supplier=1')];在使用swoole做异步任务时需要把where参数传递给异步任务处理,因为无法传递数组和对象只能传递字符串,所以需要把where数组转换......
  • 总结全网C#取随机数方法(整型,浮点型,字符串)
    原文链接:https://blog.csdn.net/m0_65636467/article/details/127770112C#取随机数(Random篇)一、整数随机数//10以内的随机整数Randomrd=newRandom();intn=ran.Next(10);//1-100的随机整数intp=rd.Next(1,100);//大于等于1小于100的整数intNext(intmi......
  • ITMS-90876 Missing entitlement 报错解决方法
    css3中的var()函数详解 发布时间:2024-05-2117:17:32 作者:佚名 我要评论在CSS3中,var()函数是一个用于插入CSS自定义属性(也称为CSS变量)的值的函数,它允许你在样式表中定义可重用的值,并在多个地方引用它们,从而使你的CSS更加灵活和可维护,这篇文章主要介绍了css3的var()函......