在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替换,如果不存在,则添加