必须在equals方法开头添加if (this == obj) return true;,这是保障自反性的第一道防线;否则字段预处理不对称或依赖可变状态会导致x.equals(x)返回false。

满足自反性,最直接有效的做法是在 equals 方法开头加一句 if (this == obj) return true;。这行代码不是可选优化,而是保障自反性的第一道防线。
为什么这一步不可省略
自反性要求:对任意非 null 对象 x,x.equals(x) 必须返回 true。如果跳过引用相等判断,后续逻辑可能因字段处理不对称而失败——比如对入参调用 trim() 或 toLowerCase(),却没对 this 做同样处理,导致自己跟自己比都返回 false。
常见破坏自反性的写法
- 字符串比较时只处理参数:
!this.name.equals(other.name.trim())→ 当this.name本身含空格,other就是this时,other.name.trim()被清理了,this.name却没清理,结果为false - 字段预处理不统一:比如在比较前对
other.name调用strip(),但没对this.name做相同操作 - 依赖外部可变状态:如在 equals 中读取一个会被修改的非 final 字段,哪怕第一次
x.equals(x)是 true,第二次就可能变成 false(连带破坏一致性)
安全可靠的写法组合
- 第一步固定写
if (this == obj) return true;—— 立刻拦截引用相等场景,天然满足自反性 - 第二步用
Objects.equals(this.field, other.field)替代手动判空+调用.equals(),它内部已处理null、空字符串和自反情形 - 确保参与比较的字段是 final 或不可变的(如
String、Integer),避免对象中途被改,导致多次equals调用结果不一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











