Java:为什么重写equals方法一定要重写hashcode方法?

预备知识:

哈希函数,哈希表,HashMap数据结构。

先说结论:

因为如果重写equals方法后不重写hashcode,会出现这么一种情况:两个equal的对象,放到hashmap数据结构中,会出现对应着两个不同的value的情况。这意味着hashmap将两个equal的对象判断为不相同。

下面解释:

map中同一个key是对应着相同的value。而map是如何判断key是否相同?首先它是先判断两个key的hashcode是否相同,如果相同的情况下,才会接着判断两个key是否equal。也就是如果hashcode不同那么就不会判断是否equal了。在map里这两个key就是不同的key,尽管他们可能根据重写的equals判断是相同的。

为什么会先判断hashcode是否相等在判断equals?

我们要知道HashCode的存在主要是为了查找的快捷性。默认的hashcode是根据改对象的地址通过hash算法得出的。而hash算法就是一种压缩算法,也就是根据不同的地址计算出来的hashcode可能是相同的,那么hashcode相同的情况下要判断两个对象是否相同就需要equals方法了。

因为判断hashcode是判断equal的先决条件,所以才会说hashcode相等但是equal不一定相等,但是equal相等hashcode一定相等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章