文章目录
前言
== 与 equals() 与 hashCode() 的区别与联系可以说是 Java 的经典和高频面试题了。
这个问题好像不难,但是如果没有好好了解一下,却是真的很容易被问住。
来个自测:
如果以下这些问题你都可以非常确定的回答出来,那这篇博客可以不用看了;反之,如果你对有些问题还不了解,或者模棱两可,那务必好好把这篇博客看完!
- == 与 equals() 的区别?
- 重写了 hashCode() 方法后,散列码(或者称为:哈希值)一样的两个对象一定相等吗?
- 如果没有重写 hashCode() 方法,散列码(哈希值)一样的两个对象相等吗?
- 为什么重写了 equals() 方法后,还要重写 hashCode() 方法? 如果不重写会出现什么问题?
下面首先将这3个单独介绍一下:
一、==
- 对于基本数据类型, == 比较的是值。
- 对于引用数据类型,== 比较的是内存地址。
二、equals()
-
equals() 是 Object 类提供的方法,若未重写,底层相当于是一个 == 。
-
但一般是使用重写后的 equals() 的方法,用来比较的两个对象的属性值是否相同。
-
Java 语言规范要求 equals 方法要满足以下五点:
① 自反性: 对于任何非空引用 x ,x.equals(x) 应该返回 true 。
② 对称性: 对于任何引用 x 和 y ,当且仅当 x.equals(y) 返回 true 时, y.equals(x) 返回 true 。
③ 传递性: 对于任何引用 x、y 和 z ,如果 x.equals(y) 返回 true , y.equals(z) 返回 true ,那么 x.equals(z) 也应该返回 true 。
④ 一致性: 如果 x 和 y 引用的对象没有发生变化,那么反复多次调用 x.equals(y) 应该返回同样的结果。
⑤ 对于任何非空引用 x , x.equals(null) 应该返回false。 -
Java的内置类一般都已经重写了 equals 方法,比如 String 类。
-
重写一个 equals() 方法
① 检查是否是同一个对象的引用,如果是的话直接返回 true 。
② 检查是否是同一个类型,如果不是的话,直接返回 false 。
③ 将对象强制转换为相应类类型的变量。
④ 判断两个对象每个字段是否都相等,基本类型字段用 == 比较,对象字段用 equals 比较;如果所有字段都相等,返回 true ,否则返回 false 。