搞懂为什么重写equals还要重写hashcode(个人自述)
1.hashCode
首先,hashCode的英文翻译就是散列码,它使用一个int值来代表对象。
我们可以使用System.identityHashCode(Objectx)方法返回默认的hashcode,无论你创建的对象是否覆盖磨人的hashCode。
hashCode方法主要是用于HashMap这样的哈希表,差不多就是全部的哈希表。
我们的哈希链表也可以叫做哈系桶,默认有16个槽位,长度为15,位置的判定主要是依靠除数和求余,更快地操作是用机器码即2的N次方,20-2^4=4。
2.equals
hashCode并不需要唯一性,但equals必须严格判断两个是否相同
以下是equals方法有如下特性:
|自反性|对称性|传递性|一致性|null|
x.equals(x)一定返回true
如果x.equals(y)=true;so y.equals(x)=true
x=y,y=z=>z=x
x and y 中介值没有改变,那么无论如何调用都不会改变
任何不是null的x,x.equals(null)一定返回false
equalsandhashcode的规定
- equals相等,hashcode一定相等。
- equals不等,hashcode不一定不等。
- hashcode不等,equals一定不等。
- hashcode相等,equals不一定相等。
因此,如果我们重写了equals,那么必须重写hashCode,使其满足这些规定。当然,如果我们不把自定义对象当成HashMap的键来使用,那么自定义对象不重写equals和hashCode也是可以的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)