Java中必须重写toString、equals和hashCode三个方法:toString用于日志调试,需格式化关键字段;equals定义内容相等逻辑,须用getClass()和Objects.equals;hashCode须与equals字段一致且不可变,确保集合正确性。

Java 中真正需要你重写的方法就三个:toString、equals 和 hashCode。
toString:日志和调试的“第一张脸”
默认返回类似 User@1b6d3586 这样的字符串,只含类名和哈希码,看不出任何业务信息。不重写,日志里全是“黑盒”,调试时得手动点开每个字段。
- 只保留关键字段,比如 id、name、status;排除密码、token、大文本、计算字段
- 格式统一用 ClassName{field1=value1, field2=value2},便于扫读和日志解析
- null 值显式写出,如 name=null 或 name=<null>,避免拼接空指针
- 不调用远程接口、数据库查询或复杂 getter,防止副作用和阻塞
equals:定义“什么才算相等”
默认行为等价于 ==,只比内存地址。业务中要按内容判断——比如两个订单只要 orderNo 相同就算同一笔,就必须重写。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 开头先用 this == obj 判断引用相等,提升性能
- 类型检查用 getClass() == obj.getClass(),不用 instanceof(继承场景下更安全)
- 字段比较统一用 Objects.equals(a, b),自动处理 null,不手写判空逻辑
- 只比较影响业务语义的字段,忽略数据库 ID(除非它就是业务主键)、时间戳、版本号等
hashCode:必须和 equals “步调一致”
它不是独立方法,而是 equals 的契约搭档。只要 a.equals(b) == true,就必须有 a.hashCode() == b.hashCode()。否则 HashMap、HashSet 会存错桶、取不到值、去不了重。
立即学习“Java免费学习笔记(深入)”;
- 必须基于和 equals 完全相同的字段计算哈希值
- 顺序建议保持一致(虽不强制,但利于维护和排查)
- 优先用 Objects.hash(f1, f2, f3),内部已做 null 安全处理
- 别用可变字段(如 status、lastModified)参与计算,对象进集合后一改字段,哈希值就变,再也找不回来

















