一篇搞懂hashcode, ==,equals的关系

== 和 equals

首先,==对于基本数据类型,对比的是值;如果是两个引用数据类型,对比的是引用对象的地址(判断两个引用是否指向同一对象)

那么我们如何比较两个引用数据类型是否相等?这里我们可以用到equals方法,下图是equals的源码
在这里插入图片描述

可以看到,equals的源码也是==,这不一样了吗?还怎么比较?
所以我们可以重写equals方法

例如:String类型就重写了equals方法,所以我们可以直接用equals方法比较两个字符串是否相等
包装类型也同样重写了equals方法,但我们用其比较时,要注意我们比较的另一个数是不是同一个类型

例如:在比较时,基本数据类型会自动装箱,然后进行equals比较值
在这里插入图片描述
结果为
在这里插入图片描述

hashcode和equals

hashcode方法的作用是返回一个哈希码,这个哈希码可以让我们快速存储和获取这个对象的位置(时间复杂度为O1)
然而,hashcode只是利用特殊算法算出来的一个值,两个不同的对象的哈希值肯定会有相同的(例如"Aa"和"BB"),所以在重复时要比较他们的值是否相等,相等就不用重复存储,不相同就要存储
说到比较,自然而然就会想到equals方法
我们知道,要重写equals方法才能判断两个对象是否相同
那么为什么hashcode方法也需要重写

因为没重写的hashcode方法,会导致对象内容一样,但是内存地址不一样,这样也会导致重复

可以看到:String重写了equals和hashcode方法:
在这里插入图片描述在这里插入图片描述

当向HashSet中加入一个元素时,它需要判断集合中是否已经包含了这个元素,从而避免重复存储。由于这个判断十分的频繁,所以要讲求效率,绝不能采用遍历集合逐个元素进行比较的方式。
所以得获取对象的哈希码;实际上,HashSet是通过获取对象的哈希码,以及调用对象的equals()方法来解决这个判断问题的。

HashSet首先会调用对象的hashCode()方法获取其哈希码,并通过哈希码确定该对象在集合中存放的位置。假设这个位置之前已经存了一个对象,则HashSet会调用equals()对两个对象进行比较。若相等则说明对象重复,此时不会保存新加的对象。若不等说明对象不重复,但是它们存储的位置发生了碰撞,此时HashSet会采用链式结构在同一位置保存多个对象,即将新加对象链接到原来对象的之后。之后,再有新添加对象也映射到这个位置时,就需要与这个位置中所有的对象进行equals()比较,若均不相等则将其链到最后一个对象之后。

总而言之,使用hashcode是为了保证性能,equals是为了保证可靠

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值