重写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码是一致的,结果也是预期的。

浙公网安备 33010602011771号