关于hashCode和equals

作者: JingChen_ | 来源:发表于2021-02-23 17:50 被阅读0次

在Object类中,有hashCode()和equals()方法,而任何类都是Object的子类,同样也继承了这两个方法。

调用hashCode方法得到一个Int类型的哈希码,这个哈希码的作用是确定该对象在哈希表中的索引位置。而equals是比较两个对象的地址是否相等。顺便提一下,基本数据类型是存在虚拟机栈中的局部变量表里面,而对象存在堆中。

基本数据类型中Int、String、Double...都覆写了equals方法,目的是为了比较两个对象的内容是否相等,所以这些数据类型比较的是内容,不同于没覆写equals的对象比较两个对象的内存地址。

那么hashCode和equals的区别在于,hashCode得到的是一个Int类型的哈希码,而equals得到的是两个对象地址比较的Boolean值。

那么hashCode和equals又有什么联系呢?

其实一般情况下都不会有什么联系,hashCode得到一个Int值,equals得到一个Boolean值,两个不同类型的值一般情况下都不会有联系。

那么什么情况下才有联系呢?

当我们在使用HashMap、HashSet...散列表时(存储对象的集合,涉及到hashCode,附上HashMap的源码解析),存储需要用到hashCode去做索引。

在散列表中,比较两个对象是否相等,首先判断两个对象的hashCode是否相等,如果相等,那么继续判断两个对象的内容是否相等,如果对象不相等,那么就equals为false。

所以得到一个结论:两个对象相等时,hashCode一定相等;hashCode相等,两个对象不一定相等。

有了上面的理解,再来看看重写equals方法时为什么要重写hashCode方法?

在散列表中,如果重写equals方法,为了比较两个对象是否相等而不是内存地址,则必须重写hashCode方法。不重写hashCode方法会导致两个对象内容相等,但是hashCode不相等的情况,由于散列表中先比较hashCode在比较内容,当hashCode不相等时,两个对象必定不相等。

相关文章

  • 再论:关于 equals 和 hashCode

    上篇 关于 equals 和 hashCode 关于 equals 和 hashCode 的基本性质已经论述过了。...

  • 第五章

    #1 【强制】关于hashCode和equals的处理,遵循如下规则# 1.重写equals,即必须重写hashCode

  • 阿里Java编程规约【五】 集合处理

    【强制】关于 hashCode 和 equals 的处理,遵循如下规则:1) 只要重写 equals ,就必须重写...

  • 阿里规约集合处理

    【强制】关于 hashCode 和 equals 的处理,遵循如下规则:1) 只要重写 equals,就必须重写 ...

  • 第9条:覆盖equals时总要覆盖hashCode

    equals方法和hashCode方法均是Object对象的方法。Object中关于hashCode约定的规范如下...

  • java容器

    equals和hashCode equals和hashcode间的关系:如果两个对象相同(即equals比较返回t...

  • 关于hashcode和equals

    这篇文要清楚这三个问题:1、hashcode,equals内容是什么?2、只重写equals()但不重写hashC...

  • 关于 equals 和 hashCode

    主要是说一下 equals 和 hashcode 1.hashCode 此方法主要是用来支持 hash table...

  • 关于hashCode和equals

    在Object类中,有hashCode()和equals()方法,而任何类都是Object的子类,同样也继承了这两...

  • 集合处理规约

    【强制】关于 hashCode 和 equals 的处理,遵循如下规则:1) 只要覆写 equals,就必须覆写 ...

网友评论

    本文标题:关于hashCode和equals

    本文链接:https://www.haomeiwen.com/subject/nxqdfltx.html