java object类考查对象本质理解,核心是逻辑一致性、线程安全性、生命周期意识三条主线:equals与hashcode须成对重写且逻辑自洽;tostring需简洁安全避免副作用;wait/notify须在synchronized中使用并配合while防虚假唤醒。

equals 和 hashCode 必须成对重写,且逻辑自洽
面试官常抛一个 User 类,让你写 equals 和 hashCode。光写对没用,得讲清为什么。
- 默认 equals 比的是内存地址,两个 new 出来的相同内容对象不相等;默认 hashCode 基于地址生成,内容相同但地址不同 → 哈希值不同
- 一旦你按 id + name 判定相等,就必须保证:所有 equals 返回 true 的对象,hashCode 返回值完全一样
- 别在 hashCode 中用可变字段(比如 status 字段),否则对象放进 HashSet 后改了 status,再也没法被 contains 找到
- 推荐用 Objects.hash(field1, field2) 生成,安全、简洁、避免空指针
toString 是调试的第一道门,别让它暴露隐患
它看似简单,但错用可能引发线上问题。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 默认输出 Person@1a2b3c4d,毫无业务信息 —— 重写是基本素养
- 格式建议简洁明确:"User{id=101, name='Tom', email='t@x.com'}",字段顺序固定,便于日志解析
- 严禁在 toString 里调用远程接口、加锁、或触发复杂计算 —— 它可能被 Log4j、IDE 变量窗、JMX 等任意上下文调用
- 若字段可能为 null,用 Objects.toString(name, "null") 避免 NPE
wait/notify 不是“线程睡醒”,而是条件协作契约
很多人能写出来,但一问“为什么必须 synchronized?”就卡壳。
- 这三个方法操作的是对象的监视器(monitor)锁,没锁就调用 → 直接抛 IllegalMonitorStateException
- wait() 不仅挂起线程,还会释放当前持有的对象锁,让其他线程有机会修改共享状态
- notify() 只唤醒一个等待线程,但无法指定唤醒谁;notifyAll() 更安全,尤其在多个条件共用同一锁时(如生产者消费者中“满”和“空”)
- 永远配合 while 循环检查条件(if → while),防止虚假唤醒
其他方法要懂边界,不滥用
不是每个方法都该重写,关键是知道“为什么不动”。
- getClass() 是 final 方法,不能重写 —— 它返回真实运行时类型,是 instanceof 的底层支撑
- clone() 默认是浅拷贝,想深拷贝必须手动递归或序列化;不实现 Cloneable 接口会抛异常
- finalize() 已废弃(Java 9 起标记为 deprecated),GC 不保证调用时机,资源清理必须靠 try-with-resources 或显式 close
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










