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

 

posted @ 2019-08-23 09:03  牧云文仔  阅读(587)  评论(0)    收藏  举报