equals和hashCode()

时间:2019-08-06
本文章向大家介绍equals和hashCode(),主要包括equals和hashCode()使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在java中,对象都继承了Object类的equals()和hashCode()方法,用于比较两个对象是否相等

如果没有重写,比较的就是内存地址,不同的对象,内存地址肯定是不同的,

如果需要根据自己的逻辑判断两个对象相等,那么就需要重写equals()和hashCode()方法

equals和hashCode的作用其实是一样的,都是用来比较两个对象是否相等的,但为什么有了equals还需要hashCode呢?

因为,equals方法一般比较的全面比较复杂,都通过equals判断的话,效率就比较低。而hashCode值需要生产hashCode值比较就可以了,效率很高,所以可以首先用hashCode判断,

但为什么hashCode效率这么高,还需要equals呢?

因为hashCode不一定准确,两个对象hashCode值相等,不能说明两个对象相等,这时候就需要进行equals判断

每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

原则:

1. equals相等,那么hashCode值一定相等 (如果hashCode值不相等,那equals一定不等,即不是相同对象)

2. hashCode相等,equals不一定相等

HashSet存:

放入对象obj

计算obj的hashCode值,和已放入对象的hashCode值是否相等,如果不想等,说明肯定是不同对象,直接放入,如果相等,再进行equals判断,相等则放入,不想等则舍弃

HashMap存取操作:

put:

首先得到hashCode值,hash算法通过hashCode值得到一个数组的index,找到对应位置,如果为null,就直接放入,如果不为null,则使用链地址法,equals方法判断这个key在链表中是否存在,如果存在,则把原有key的value替换,如果不存在,则添加

原文地址:https://www.cnblogs.com/gucl/p/11311792.html