必须重写 toString() 和 equals() 方法,因默认实现无法满足业务需求:toString() 默认返回类名加哈希码,不利于调试,应展示关键字段且避免异常与耗时操作;equals() 默认比较引用地址,需遵循契约并同步重写 hashCode(),否则集合操作异常。

Java 中 Object 类的 toString() 和 equals() 方法是每个对象都继承的基础方法,但默认行为往往不满足业务需求,必须重写才能正确使用。
为什么要重写 toString()?
默认的 toString() 只返回类名加哈希码(如 Person@1b6d3586),对调试和日志毫无帮助。重写后可清晰展示对象关键字段。
- 重写时建议包含所有重要属性,用简洁格式(如
"Person{name='张三', age=25}") - 避免在
toString()中调用可能抛异常或耗时的操作(如数据库查询、IO) - IDE(如 IntelliJ)通常支持一键生成,也可手动编写,注意空值安全(用
Objects.toString(field, "null"))
equals() 的正确重写规则
默认 equals() 比较的是引用地址,两个内容相同但不同实例的对象会判定为不等。重写必须遵守官方契约:自反性、对称性、传递性、一致性、对 null 不抛 NPE。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先用
==判断是否为同一对象(提高效率) - 再用
instanceof或getClass() == obj.getClass()判断类型(推荐后者,避免子类误判) - 强制转换后逐个比较关键字段,基本类型用
==,引用类型用Objects.equals(a, b)(自动处理 null) - 重写
equals()后,必须同时重写hashCode(),否则放入HashSet或作为HashMap键时行为异常
实际写法示例(Person 类)
以下是最简实用写法:
立即学习“Java免费学习笔记(深入)”;
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
常见误区提醒
很多初学者直接用 IDE 自动生成却忽略细节,导致隐患:
- 忘记重写
hashCode()→ 集合中无法正确查找或去重 - 在
equals()中用了==比较字符串或其他引用类型 → 总是返回 false -
toString()中拼接大量字段或调用 getter 副作用方法 → 日志输出变慢甚至死锁 - 子类重写
equals()时只比较新增字段,忽略父类字段 → 破坏对称性

















