为什么要有hashCode?
发表于|更新于|技术博客
|总字数:493|阅读时长:1分钟|浏览量:
“ HashSet 如何检查重复”为例⼦来说明为什么要有 hashCode ?
当你把对象加⼊ HashSet 时, HashSet 会先计算对象的 hashCode 值来判断对象加⼊的位置,同时也会与其他已经加⼊的对象的 hashCode 值作比较如果没有相符的hashCode , HashSet 会假设对象没有重复出现。但是如果发现有相同 hashCode 值的对象,这时会调⽤ equals() ⽅法来检查 hashCode 相等的对象是否真的相同。如果两者相同, HashSet 就不会让其加⼊操作成功。如果不同的话,就会重新散列到其他位置。这样我们就⼤⼤减少了 equals 的次数,相应就⼤⼤提⾼了执⾏速度。
hashCode() 和 equals() 都是⽤于比较两个对象是否相等
JDK 还要同时提供这两个⽅法?
在⼀些容器(⽐如 HashMap 、 HashSet )中,有了 hashCode() 之后,判断元素是否在对应容器中的效率会更⾼(参考添加元素进 HashSet 的过程)!
不只提供 hashCode() ⽅法呢?
这是因为两个对象的 hashCode 值相等并不代表两个对象就相等。
==哈希碰撞也就是指的是不同的对象得到相同的hashCode==
总结
- 如果两个对象的
hashCode
值相等,那么这两个对象不一定相等(哈希碰撞) - 两个对象的
hashCode
值想到并且equals()
方法也返回true
,这两个对象是相等的 - 两个对象的
hashCode
值不相等,那么两个对象一定不相等
拓展知识
为什么重写equals()方法时,hashCode方法也必须重写?
因为两个相等对象的hashCode值也必须相等.
如果重写equals()时,没有重写hashCode方法,可能导致equals()方法判断两个值相等,hashCode()值却不相等.
总结
equals
方法判断两个对象是相等,那么两个对象的hashCode
值一定相等- 两个对象有相同的
hashCode
,他们也不一定是相等的(哈希碰撞)
文章作者: MUMU
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 blog.wo0ow.com!