【Java基础】equals()与hashcode()

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<K, V>中存放数据,这个大概过程就是将Key作为参数传给hashCode(),然后hashCode()返回一个整数值,这个整数值再通过某种机制转换为散列表下标最后再存入散列表对应的下标的位置。

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

1.3 图示HashMap的原理

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

请添加图片描述

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

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

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

我们要分情况讨论。

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

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

2.2 会创建某个类的散列表

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

上我们可以总结出:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少不入川。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值