为什么hashcode和equals总是一起去覆盖实现
来源:2-5 使用自定义类测试我们的算法
小白一只726
2023-09-18 23:22:53
实际开发中,为什么要实现equals的同时也得把hashcode给实现了呢?
1回答
liuyubobobo
2023-09-19
只是一个开发的“规范”或者“原则”,而非必须。
逻辑上需要 equals 的时候,实现 equals 不需要实现 hashcode,因为需要 == 的时候不一定需要把类对象扔给哈希表。
但是如课程中哈希表章节所介绍的,实现 hashcode 的时候一定要实现 equals,因为实现 hashcode 意味着这个对象需要扔给哈希表,但是扔给哈希表以后在哈希冲突的时候需要使用 equals 来确认元素。
==========
但注意,这是逻辑上。这里实现 equals 可以不实现 hashcode 有一个重要假设:你不需要把类扔给哈希表(或者哈希相关的数据结构。)
而在大型项目中,哈希相关的数据结构是非常常用的。即使在你的代码中没有使用哈希表,在框架的底层,也有可能会在你看不见的地方把你的对象扔给哈希表使用。此时就会出问题。
因为实现 equals,而不实现 hashcode,造成了 hashcode 定义的失败。即两个对象有可能相等(equals 返回 true),但是哈希值不等。
为了避免这种情况,从预防 bug 的角度,一旦覆盖 eqauls,就手动覆盖 hashcode,是更安全的。这是从安全性考量的,而非从逻辑上考量的。(btw,从安全性考量,多做一些事情,而不是做逻辑上要求的刚刚好的事情,是非常常见的。)
继续加油!:)
相似问题