object类默认equals()方法仅比较引用是否指向同一内存地址,等价于==运算符,不比较内容;需重写以实现逻辑相等,并同步重写hashcode()以满足集合契约。

Object 类默认的 equals() 方法直接比较两个对象的引用是否指向同一内存地址,也就是使用 == 运算符进行判断。
它只判断“是不是同一个对象”
默认实现不关心对象的内容、字段值或逻辑相等性,仅检查两个引用变量是否指向堆中同一个实例。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
String a = new String("hello");
String b = new String("hello");
System.out.println(a.equals(b)); // true(因为 String 重写了 equals)
System.out.println(a == b); // false(不同对象,地址不同)
Object x = new Object();
Object y = new Object();
System.out.println(x.equals(y)); // false(Object 默认 equals 等价于 x == y)
源码非常简单
在 JDK 的 Object 类中,该方法定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
- 参数为
Object类型,支持任意对象传入 - 若传入
null,结果直接为false(因为this不可能为null) - 没有空指针检查,也不做类型转换或字段比较
为什么需要重写 equals()
大多数业务场景下,“内容相同即相等”比“地址相同即相等”更有意义。比如两个 Person 对象,姓名和身份证号一样,就应视为相等。这时必须:
- 在自定义类中重写
equals() - 同时重写
hashCode(),以满足哈希集合(如HashMap、HashSet)的契约 - 遵循对称性、传递性、一致性、非空性等约定
常见误区提醒
- 不要只重写
equals()而忽略hashCode() - 重写时注意判空:先用
obj == null和getClass() != obj.getClass()排除非法输入 - 避免用
instanceof判断类型(可能导致违反对称性,尤其在继承关系中) - 字段比较建议用
Objects.equals(field1, field2)处理可能为null的情况
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










