hashCode和equals

equals()用于判断两个对象是否相等,这是大家公认的。
hashCode()被设计是用来使得哈希容器能高效的工作。

为什么这么说?在java中,有一些哈希容器,比如Hashtable,HashMap等等。当我们调用这些类的诸如get(Object obj)方法时,容器的内部肯定需要判断一下当前对象obj在容器中是否存在,以便进行后续的操作。判断是够存在,肯定是要比较两个对象是否相等,我们"应该"要使用equals()才是正确的。

但是如果哈希容器中的元素有很多的时候,使用equals()必然会很慢。这个时候我们想到一种替代方案就是hashCode()。hashCode()返回一个int类型,比较起来要快很多。但这也造成了一个问题,就是一个判定两个对象事实上存在两个标准?当然不是这样的,正如在文章开头所说,hashCode()被设计用来使得哈希容器中能高效的工作。也只有在哈希容器中,才使用hashCode()来进行比较对象是否相等,而且还是弱的比较。

当我们调用哈希容器的get(Object obj)方法时,他会首先查看当前容器中是够存在相同的哈希值,如果不存在,那么返回null。如果存在,再调用当前对象的equals()方法比较一下看哈希处的对象是否和要查找的对象为相同的对象,如果不是,那么返回null。如果是,说明当前哈希容器存在相应的值,返回该哈希处的对象。

这样hashCode()方法就提高了哈希容器的效率,这就是hashCode()存在的意义。我们可以把hashCode()相等看成是两个对象相等的必要非充分条件,equals()相等才是充分条件。因此,在自定义一个类的时候,我们必须要同时重写equals()和hashCode(),并且必须保证:
1 如果两个对象的equals()相等,那么他们的hashCode()必定相等。
2 如果两个对象的hashCode()不相等,那么他们的equals()必定不等。


作者:E-臻
来源:CSDN
原文:https://blog.csdn.net/yizhenn/article/details/52384524
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值