hashcode和equals

来源:14-3 Java中的 hashCode 方法

30K必胜

2019-01-12

通过这门课程,让我想明白了一个道理,就是java的复合类型中为什么要有hashcode和equals这两个方法?它们的存在意义是什么?

是因为,要想把复合类型存储进hash表中,是必须要计算hash表的索引,拿到了索引才能将这个复合类型放进去,而索引的计算的前提就是要拿到hashcode;

两个复合类型的内容是否相等不能单纯的依靠hashcode,因为它们的侧重点不同,hashcode是用来计算这个复合类型在哈希表中的存储位置,而equals是为了判断这两个复合类型的内容是否相等,所以说hashcode相同并不能代表这两个对象的内容是相同的,例如,ZHANG和zhang是否相等?对于hashcode来说,它们可以得到相同的hashcode,这完全取决于hashcode的计算标准,但是对于内容来说又是另一套判断标准,我们希望大小写敏感,那么ZHANG和zhang就不相等了;

所以说,hashcode和equals,它们描述的是两个侧重点,这就让我们在编程中注意了,当比较这两个复合类型内容是否相等的时候,一定要用equals。

写回答

3回答

凌子祺

2020-03-03

感谢!解惑了。之前的疑问一直是,为什么在equals里面不直接return两个hashCode是否相等就可以。

在你这看到了解答。

0
0

_潇潇暮雨

2019-08-21

其实我感觉hashCode只有在存储hash表中会用到,从语言的设计角度来讲是不是应该向Compareable接口那样设计一个Hashable接口,而不是所有的类都有hashCode方法。

0
1
liuyubobobo
我个人认为这样设计也没有毛病:)但是,这样想下去,没完没了。比如 Object 默认也有 equals 方法,但是不是其实应该定义一个 Equalable 的接口呢?我觉得也没毛病。Java 选择对于这些方法,默认放置在 Object 中,如果你的对象不需要应用 hashCode,hashCode 这个方法也没有任何反面影响,也没有毛病。归根到底,这是一个设计问题。设计问题没有绝对的对与错:)
2019-08-22
共1条回复

liuyubobobo

2019-01-12

大赞!:)


感谢分享:)


继续加油!:)

0
5
liuyubobobo
回复
凌子祺
了解了。其实,如果能严谨地按照进制的方式定下来 B 最好,比如如果字符串的取值范围就是 26 个字母,B 取 26 肯定没有问题。但是,如果数据的取值范围特别随意的话,B 按照严谨的进制取值,就会造成哈希结果极度稀疏。比如对于日期,年份假定最大是 9999,此时,B 取 10000 是最合理的,但是这样做,哈希值的范围太大了。这种情况,适当缩小 B 的值,严格来说,这个数据不是一个 B 进制的数,但此时只是多了哈希冲突而已,不影响我们逻辑的正确性。 举个例子,假设十进制的数字,但是我们的 B = 5,会发生什么?此时 【81】这个表示的哈希值等于41(8*5+1),而【76】这个表示的哈希值也是41【7*5+6】,所以,【81】和【76】哈希冲突了。但是如果 B = 10,不会出现这样的哈希冲突。 因此,B 的大小,是在调节哈希值的范围和哈希冲突出现的频率。B 越大,哈希值的范围越广,冲突出现的概率越小;B 越小,哈希值的范围约窄,但冲突出现的概率也越高。我们需要根据自己的数据,选择合适的 B。继续加油!:)
2020-03-04
共5条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程