hashCode()和equals()
Posted jiachao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hashCode()和equals()相关的知识,希望对你有一定的参考价值。
- 区别、联系
- public int hashCode():返回一个对象的哈希码值
- public boolean equals(Object obj):判断两个对象是否相等,即是否指向同一内存地址;重写之后则比较的是两个对象的内容是否相等
- 如果两个对象互相equals(),则hashCode()也必须相等
- hashCode()相等的两个对象,不一定equals()
- hashCode()比较时,只需要生成一个hash值即可,相比于equals()效率高,但hashCode()并不可靠;所以,在比较时,先通过hashCode()进行比较,如果hashCode()都不一样,则无需进行equals()再比较,两个对象肯定不相等;如果hashCode()一样,再调用equals()方法进行比较,二者都相等,则两个对象相等
- 使用场景
- hashCode()在哈希表中大量使用,如HashMap、HashSet中;当往哈希表中添加元素时,首先会计算该元素的哈希码,通过tab[i = (n-1) & hash]计算该hash值对应在哈希表中的数组位置,如果该位置的桶为空,则直接插入;如果该位置的桶不为空,则调用equals()方法遍历桶中元素,判断是否有相等的元素,有则不保存,没有则添加至链表末端(即两个对象互相equals(),则hashCode()也必须相等)
- 重写
- Object类中的equals()比较的是两个对象的地址值,而不是内容,所以比较两个对象内容时要重写;
- 重写equals()时总要重写hashCode(),因为如果两个对象互相equals(),则hashCode()也必须相等;
以上是关于hashCode()和equals()的主要内容,如果未能解决你的问题,请参考以下文章