重写equals方法的时候为什么需要重写hashcode

一、“==”和equals()方法

Java的Object.equals() 底层就是“==”

“==” 针对基本数据类型比较的是值是否相等,引用数据类型比较的是引用存储地址是否相等,所以也就是说Object中的equals方法是直接比较的地址

二、equals()和hashCode

object的hashCode值是根据内存地址换算出来的一个值。所以也就是说每个new出来的对象,不管内容是否一样,hash值都是不一样的

如果业务上有类似hashMap里存放key是对象的需求,比较关心的有2点,1.不管是put还是get都需要得到key的哈希值,去定位key的数组下标; 2.在get的时候,需要调用equals方法比较是否有相等的key存储过。

重写了equals()但是没有重写hashCode

 

 发现,同样的一个对象,为什么在map中存了2份,map的key值不是不能重复的么?没错,它就是存的2份,只不过在它看来,这2个的key是不一样的,因为他们的哈希码就是不一样的,可以自己测试下,上面打印的hash码确实不一样。加上重写hashCode()方法后,运行结果如下:

 

 可以看到,hash码是一致的,结果也是预期的。

posted @ 2021-02-19 11:59  我是张某某  阅读(117)  评论(0)    收藏  举报