hashCode()和equals()终于傻傻可以分清楚了

一.hashCode()和equals()作用

1.hashCode()和equals()都是Obiect类中的方法

先看看Object类中这两个方法的定义:

Object 的 hashCode 方法是本地方法,也就是用 c 或 c++ 实现的,该方法直接返回对象的内存地址
Object 的 equals 方法是用 == 去比较两个对象的地址值是否相等

但实际应用中,我们一般比较两个对象是否相等,是通过这两个对象的成员属性来判断的.故需要去重写这两个方法:

如果类中不重写此方法:
hashCode(): 返回的是对象的地址值
equals(): 比较两个对象的地址值是否相等

如果类中重写此方法:
hashCode(): 返回的是根据对象的成员变量,计算出的一个整数值
equals(): 比较两个对象的成员信息是否相同

2.类中重写hashCode()和equals()来比较两个对象是否相等

equals()比较是相等的,那么hashCode()肯定相等,也就是equals()是绝对可靠的;
hashCode()比较是相等的,那么equals()不一定相等,也就是hashCode()不是绝对可靠的;

3.既然equals()比较是绝对可靠的,为啥还要重写hashCode()呢

对于一个有大量成员信息的对象来说,通过equals()去比较的话效率是很低的
所以,一般是通过hashCode()和equals()搭配使用来提高效率: 先用hashCode()比较,如果不同则两个对象一定不相等; 如果相同则再通过equals()进行比较

==>HashSet集合能保证元素的唯一性,底层正是通过
hashCode()和equals()来实现的

二.HashSet集合元素唯一性原理

其添加元素的add()方法再执行过程中,是进行了元素的判断的,这个判断流程是:

1.先比较元素的哈希值是否相同,这个哈希值就是通过元素的hashCode()计算出来的
    2-1.如果哈希值不同,则直接添加到集合中;
    2-2.如果哈希值相同,则继续通过equals()来比较
        3-1.返回true,说明元素重复,不添加
        3-2.返回false,说明元素不重复,添加

结论:
我们使用HashSet集合来存储对象,你想保证元素的唯一性,就必须重写它的hashCode()和equals()方法

 

posted @   Sherlock先生  阅读(203)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示