equals

==与equals的区别,以及相关系列的问题

1、==

2、equals()

3、hashcode()

4、相关问题

4.1 重写完hashcode方法之后,散列码相同的两个对象一定相等吗?
4.2 如果没有重写hashcode方法,散列码一样的两个对象一定相等吗?
4.3 为什么重写了equals方法还要重写hashcode方法?如果不重写会怎样?

1、==

​ 如果是两个基本数据类型作比较的话,==比较的是值

​ 如果是两个引用类型作比较的话, ==比较的是内存地址

2、equals

​ 1、首先我们知道equals方法是object类中的一个方法,如果不进行重写的话他的作用等效于==
equals

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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类
equals

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]equals

那么在set中就会添加两个相同的对象
equals

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z18MvHBf-1631019348347)(D:\mycsdn\images\result1.png)]

反之如果重写了hashCode方法则不会

么在set中就会添加两个相同的对象

[外链图片转存中…(img-z18MvHBf-1631019348347)]

反之如果重写了hashCode方法则不会
equals

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LDMtEdU9-1631019348350)(D:\mycsdn\images\result2.png)]

上一篇:JAVA基础随手记


下一篇:JAVA中重写equals方法相关细节备忘