Java为什么要同时重写equals和hashcode
一、==和equals的区别
1.==比较的是内存地址是否相同
2.Object类的equals方法,比较两个对象的内存地址是否相同
3.自定义类的基类都是Object类,使用Object类的equals方法,比较内存地址是否相同
4.某些业务场景下,希望比较对象的值是否相同,所以需要重写equals方法
二、重写equals方法,为什么需要同时重写hashCode方法
1.hashCode方法常规约定:值相同的对象,必须有相同的hashCode
2.equals方法为true,hashCode必须相同
3.hashCode不同,equals方法必须为false
4.hashCode相同,由于hash冲突,equals方法可能为false
三、如果不同时重写hashCode方法,在集合中会有问题
1.HashSet
a.存储的是不重复的对象,底层源码根据hashCode方法和equals方法进行判断
b.两个对象比较相等,那么预期在HashSet里只有一条数据;如果只重写equals方法而不重写hashCode方法,结果会存入两条数据,因为两个对象的内存地址不一样;取数据的时候,也会取出来两条数据
2.HashMap
a.存储的是不重复的key
b.如果使用自定义对象作为key,必须重写hashCode方法和equals方法
c.两个对象比较相等,那么预期这两个对象是同一个key,存入hashmap时,预期只存入一条数据;如果只重写equals方法而不重写hashCode方法,结果会存入两条数据,因为两个对象的内存地址不一样;取数据的时候,也会取出来两条数据
四、String已经重写了hashCode方法和equals方法,所以最常作为key来使用
参考:
https://blog.csdn.net/qq_35471409/article/details/118675755
https://baijiahao.baidu.com/s?id=1664183772462382553&wfr=spider&for=pc
浙公网安备 33010602011771号