==与equals的区别,以及相关系列的问题
1、==
2、equals()
3、hashcode()
4、相关问题
4.1 重写完hashcode方法之后,散列码相同的两个对象一定相等吗?
4.2 如果没有重写hashcode方法,散列码一样的两个对象一定相等吗?
4.3 为什么重写了equals方法还要重写hashcode方法?如果不重写会怎样?
1、==
如果是两个基本数据类型作比较的话,==比较的是值
如果是两个引用类型作比较的话, ==比较的是内存地址
2、equals
1、首先我们知道equals方法是object类中的一个方法,如果不进行重写的话他的作用等效于==
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aGhhgbNv-1631019348334)(D:\mycsdn\images\equals.png)]
所以我们在应用时一般会重写equals方法,用来比较两个对象的属性是否相等
2、一般来讲规范的equals要满足:
自反性(x.equals(x) 应该是true)
对称性(x.equals(y)与y.equals(x)的返回值应该是一致的)
传递性(x.equals(y) y.equals(z) 如果是ture n那么x.equals(z)也应该是true )
一致性(如果x和y的引用没变,那么多次调用x.equals(y)的结果应当是一致的
对于任何非空引用x,x.equals(null)都应该返回false
3、一般来讲java的内置类都重写了equals方法,比如String类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1GW3CADJ-1631019348339)(D:\mycsdn\images\String_equals.png)]
4、重写一个equals方法的步骤
4.1 先判断两个对象是否是同一个引用,如果是就直接返回true
4.2 判断两个对象是否是同一个类型,如果不是就直接返回false
4.3 将对象强制转换为相应类类型的变量
4.4 判断两个对象的每个字段是否相等,基本数据类型用==判断,应用数据类型用equals判断,如果都相同就返回true,否则返回false
3、hashcode()
这个原理可以参考 :https://blog.csdn.net/jwbjwb123/article/details/119876353?spm=1001.2014.3001.5502
3.1 hashcode()是Object的一个方法,用于返回对象的hash码,返回类型是int
4、相关问题
4.1 重写完hashcode方法之后,散列码相同的两个对象一定相等吗?
答案是不一定,简单来说不同的对象经过重写的hash算法之后得到的hash码是有可能相同的。
比如一个hash的计算方法是hash%2,那么 3 和 5 经过计算之后得到的hasa码是相同的。
4.2 如果没有重写hashcode方法,散列码一样的两个对象一定相等吗?
答案也是不一定,因为根据鸽巢原理即使是不同的对象也会产生相同的hash码。
4.3 为什么重写了equals方法还要重写hashcode方法?如果不重写会怎样?
在一般情况下这两个操作是一起重写的,如果只重写了equals,可能会导致在向set集合中添加对象时,添加重复的对象。如下没有重写hashCode()方法时
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3503BLAv-1631019348343)(D:\mycsdn\images\override.png)]
那么在set中就会添加两个相同的对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z18MvHBf-1631019348347)(D:\mycsdn\images\result1.png)]
反之如果重写了hashCode方法则不会
么在set中就会添加两个相同的对象
[外链图片转存中…(img-z18MvHBf-1631019348347)]
反之如果重写了hashCode方法则不会
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LDMtEdU9-1631019348350)(D:\mycsdn\images\result2.png)]