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()的主要内容,如果未能解决你的问题,请参考以下文章

Java中关于equals()和hashCode()的问题

在java中,关于equals(),和hashCode()的重写问题。

hashcode和equals方法

hashcode和equals

重写hashcode和equals怎么重写

一文搞懂 == equals和hashCode