hashcode 相等两个类一定相等吗?equals 呢?相反呢?
hashCode 相等,equals 也不一定相等,两个类也不一定相等。
equals 相同,说明是同一个对象, 那么 hashCode 一定相同。
哈希表是结合了直接寻址和链式寻址两种方式,所需要的就是将需要加入哈希表的数据首先计算哈希值,其实就是预先分个组,然后再将数据挂到分组后的链表后面,随着添加的数据越来越多,分组链上会挂接更多的数据,同一个分组链上的数据必定具有相同的哈希值,java 中的 hash 函数返回的是 int 类型的,也就是说,最多允许存在 2^32 个分组,也是有限的,所以出现相同的哈希码就不稀奇了。
重名的人很多,名字相同, 但不是同一个人, hashCode 就是名字,人就是对象。
在 Java 中, hashCode
和 equals
的关系是这样的:
equals
相等的两个对象, hashCode
一定相等 :
- 如果两个对象使用
equals
方法比较相等,那么它们的hashCode
也必须相等。这是为了保证在基于哈希的集合(如HashMap
、HashSet
)中能够正常工作。
hashCode
相等的两个对象,不一定相等 :
- 两个对象的
hashCode
相同并不意味着它们通过equals
方法比较一定相等。这种情况称为哈希碰撞,即不同对象产生了相同的哈希值。
总结:
equals
相等 ⇒hashCode
相等hashCode
相等 ≠equals
相等
理解这一点对于实现自定义对象的比较和存储在集合中非常重要。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论