【Java基础】equals()与hashcode

【Java基础】equals()与hashcode,第1张

1.equals()与hashCode()的介绍 1.1 equals()

关于equals()我就不过多赘述,大体就是判断两个对象是否相等,关于equals()与==的用法如果感兴趣的话,可以看看我的这篇博客:https://blog.csdn.net/qq_52002412/article/details/124508558,新人博主,写的不好的地方还请多多包涵。

1.2 hashCode()
  • hashCode()的作用是返回散列码(也被称为哈希码),他返回一个整数,这个整数用来判断该对象在散列表中的下标。

  • hashCode()被定义在Object类中,Object是所有类的超类,这就意味着每一个类都拥有该方法。

  • hashCode()只有再创建某个类的散列表(如HashMap)的时候才有用。

举个栗子来说明一下hashCode()的用处:

比如说我们向一个HashMap中存放数据,这个大概过程就是将Key作为参数传给hashCode(),然后hashCode()返回一个整数值,这个整数值再通过某种机制转换为散列表下标最后再存入散列表对应的下标的位置。

重点不在这里,想要了解更多的细节的同学,可以看看HashMap的底层源码。

1.3 图示HashMap的原理

在这里稍微提一下HashMap大概的数据结构,这样会对我们更好的理解后面的内容。如图

2.equals()与hashCode()的联系

如果我们自己创建了一个类,并且重写了这个类的equals()方法,一般IDE会建议我们顺便重写一下hashCode()方法。

而两个方法是否有关系呢?

我们要分情况讨论。

2.1 不会创建某个类的散列表

如果不会创建某个类的散列表,那么equals()与hashCode()一点关系没有。真的真的我不骗你。

2.2 会创建某个类的散列表

如果创建某个类的散列表的话,那么加入这个类的对象加入散列表时,程序首先会通过hashCode()得到这个类的哈希码,然后通过除余或者是其他的方式得到该对象在散列表中的下标。然后在以该下标为头结点的链表中,如果不存在其他节点,那么这个对象直接加入这个链表中,如果存在其他节点,那么就会使用equals()方法来判断这个链表中是否存在与之相等的“值”,存在则不加入,不存在则加入。

上我们可以总结出:

  • 如果两个对象hashCode()相等,它们并不一定相等。
  • 如果两个对象相等,那么它们的hashCode()值一定相同。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/795416.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存