重写hashCode 和equals方法的必要性

 

想必在最开始的时候都经历过为啥String 对象明明设置的字符串一样用== 的时候不一定会相等,用equals方法就会相等;用同一个实体类new出两个属性值相等的对象,hashCode值不一样等等。

其实对上述有疑问还是java的基础知识没有掌握牢固。

 

我们来拿HashMap来做说明

首先HashMap是由数组+链表(当链表的长度超过一定时,会转化为红黑树)组成的,当put一个[k,v]时,首先会对k进行hashCode判断是否相等,如果相等,然后再用equals判断是否相等,如果不相等,则会放入map,此时size会+1,相等则覆盖value.

平常我们在用String ,Integer,Long等类型作为map的key的时候,似乎不存在String、 Integer或者Long的实际值一样时(这里统一指new出来的,因为String 、Integer、Long都存在缓存),对象不一样,作为map的key是可以正确判断出来是否已经存在当前key了,而自己自定义一个对象作为key就达不到这样的效果了。

 

如图自己定义一个一个int属性的key,然后new两个int值相等的不同对象测试,结果也是和上面说的一致

 

 

问题就是处在hashCode和equals方法上了。

hashCode 和equals方法是Object方法的方法, hashCode 默认返回的是内存地址(不同虚拟机的实现可能不同),equals方法比较的是内存地址是否相等。所以上面的两个key对象hash和equals不相等。

既然如此,那问题来了,为啥Integer 、Long、和String等这些对象的值如果相等,hash和equals确可以相等呢,

 

原因很简单,因为它们内部根据实际的值进行了方法的重写。以此确保相等。

 

所以如果要用自定义的对象放入集合且需要做去重处理等,一般最好重写equals和hashCode方法。

 

 

posted @ 2021-11-12 00:12  whltw  阅读(60)  评论(0)    收藏  举报