object.equals默认是引用比较(==),只判断是否同一对象实例;未重写时,内容相同的对象equals返回false;重写需遵守自反性、对称性、传递性、一致性及null处理约定,并应同步重写hashcode。

Java 中 Object.equals 方法的默认实现就是引用相等(即 ==),它不比较对象内容,只判断两个引用是否指向堆内存中的同一个对象。
默认 equals 就是 ==
在 Object 类中,equals 的源码非常简单:
public boolean equals(Object obj) {
return (this == obj);
}
这意味着:只要不是同一个对象实例,即使字段值完全一样,equals 也返回 false。
- 例如两个
new String("abc")创建的字符串对象,equals返回false(未重写时) - 但
String类重写了equals,所以实际使用中它们会按内容比较——这是子类行为,不是Object默认规则
什么时候会用到默认 equals
当你自定义类没重写 equals,又调用了它,就走默认逻辑:
- 集合查找(如
list.contains(obj)、set.remove(obj))依赖equals,若未重写,可能查不到“内容相同”的对象 - 单元测试中直接断言
obj1.equals(obj2),若期望内容相等却忘了重写,容易误判 - 作为 Map 的 key 时,
get()或containsKey()也会失效(除非 key 是同一实例)
重写 equals 的基本要求
若需按业务逻辑判断“相等”,必须重写 equals,并遵守以下约定:
-
自反性:对非 null 引用
x,x.equals(x)必须为true -
对称性:若
x.equals(y)为true,则y.equals(x)也必须为true -
传递性:若
x.equals(y)且y.equals(z)为true,则x.equals(z)也应为true - 一致性:多次调用结果不变(前提对象状态未修改)
-
对 null 的处理:对任意非 null 引用
x,x.equals(null)必须返回false
实践中建议配合重写 hashCode(),否则在哈希集合中行为不可预期。
常见错误示例
以下写法看似合理,实则违反约定:
- 参数类型写成具体类(如
equals(MyClass other)),导致重载而非重写,父类equals仍走默认逻辑 - 忽略
null检查或类型检查(应先用instanceof或getClass() == obj.getClass()) - 只比较部分字段,遗漏关键业务属性,导致逻辑“相等”却被判定为不等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











