先判断 this == obj 是为了快速确认引用是否相同,开销最小且保障自反性;它不能替代 null 检查,需在判空前执行,仅优化流程而不影响语义相等判断。

在重写 equals 方法时,第一行通常写 if (this == obj) return true;,这是为了快速判断两个引用是否指向同一个对象——即内存地址完全相同。这种比较开销极小,且能正确处理自反性(obj.equals(obj) 必须为 true),是规范实现的必要步骤。
为什么先判断 this == obj
这是最廉价的判断:直接比较栈中的引用值,不涉及任何字段读取或方法调用。如果为 true,说明是同一个对象实例,逻辑上必然相等,可立即返回 true,避免后续冗余检查。
它和 == 判断 null 的关系
这个判断本身不能替代 null 检查。因为如果 obj 为 null,this == obj 结果为 false,不会提前返回,后续仍需显式判空。标准写法应是:
- 先
if (this == obj) return true; - 再
if (obj == null) return false; - 然后
if (getClass() != obj.getClass()) return false;(或用instanceof,视需求而定)
注意:它只对引用类型有效
this == obj 比较的是引用,不是内容。即使两个对象字段一模一样,只要不是同一实例,该判断就为 false,流程会继续向下执行字段比较逻辑。它不代替后续的语义相等判断,只是优化和兜底。
常见误区
- 误以为写了
this == obj就不用判null—— 实际上null和任何非空引用用==都为false - 在子类中使用
instanceof时,this == obj依然有效,且应在instanceof之前执行 - 若类不可被继承(加了
final),getClass() == obj.getClass()更安全;否则instanceof可支持多态相等,但需确保对称性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











