Object类是Java所有类的根,equals必须重写以支持逻辑相等判断,否则集合操作异常;重写equals必重写hashCode,否则HashMap等失效;toString重写提升调试可读性;clone默认浅拷贝,深拷贝需手动或序列化实现。

Object 类是所有 Java 类的根,面试官常从这里切入考察你对底层机制的理解深度。破题关键不是背方法名,而是讲清每个方法在什么场景下必须重写、为什么默认行为不适用、以及不重写的实际后果。
equals 和 == 必须分清本质区别
== 比较的是引用地址(对象)或值(基本类型);equals 默认行为和 == 完全一致,只是个“空壳”。真正有意义的 equals 一定需要重写——比如 String、LocalDateTime、自定义的 User 类。不重写就会导致:
- 两个内容相同但不同实例的对象,set.add() 会重复添加,map.get() 查不到
- 单元测试中 assertEqual 失败,即使字段值一模一样
重写时务必遵守对称性、传递性、一致性等契约,推荐用 Objects.equals(a, b) 避免空指针。
hashCode 不重写,集合就“失灵”
只要重写了 equals,就必须重写 hashCode——这不是约定,是 HashMap、HashSet 等数据结构正常工作的硬性要求。原理很简单:HashMap 先用 hashCode 定位桶位置,再用 equals 判定是否为同一键。如果只重 equals 不重 hashCode:
立即学习“Java免费学习笔记(深入)”;
- 两个逻辑相等的对象可能被散列到不同桶里
- map.containsKey() 返回 false,哪怕 key 内容完全一致
- HashSet.add() 可能存入重复对象
建议用 IDE 自动生成(如 IntelliJ 的 Alt+Insert → “Generate hashCode and equals”),或用 Objects.hash(field1, field2) 手动构造。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
toString 重写是调试友好度的分水岭
默认 toString 返回类似 com.example.User@1a2b3c4d,对排查问题毫无帮助。重写后能让日志、异常堆栈、IDE 调试视图直接显示关键字段:
- 打印日志时不用手动拼接:
log.info("user: {}", user)就能输出User{id=101, name='张三', age=28} - JUnit 断言失败时,错误信息自带可读结构
- Spring Boot Actuator /health 端点返回体更清晰
不必过度设计,用 Lombok 的 @ToString 或一行 return String.format("User{id=%d, name='%s'}", id, name) 即可。
clone 方法要用就得懂浅拷贝陷阱
Object.clone() 是受保护的 native 方法,调用前必须实现 Cloneable 接口,否则抛 CloneNotSupportedException。它默认只做浅拷贝:
- 基本类型字段复制值,没问题
- 引用类型字段复制的是地址,新旧对象仍共享同一份 List / Date / 自定义对象
若需深拷贝,常见做法有:
- 手动递归 clone 引用字段(适合结构简单)
- 用序列化方式(如 ByteArrayOutputStream + ObjectInputStream)
- 改用不可变对象设计(推荐,避免拷贝问题)
注意:很多现代框架(如 Spring BeanUtils.copyProperties)默认也不处理嵌套对象拷贝,这点和 clone 行为一致,需特别留意。

















