equals默认行为与==完全一致,均比较内存地址;重写后才比较逻辑内容,且必须满足自反性、对称性等规范,并同步重写hashcode,否则hashmap中可能丢失数据。

Object 类看似简单,但面试官常通过它考察你对 Java 基础机制的理解深度——不是背方法名,而是看你怎么处理边界、陷阱和设计意图。答得好,能直接拉开差距。
equals 和 == 的区别不能只说“值 vs 地址”
要指出:== 比较的是引用(内存地址),而 equals 默认行为和 == 完全一致;只有重写后才可能比较逻辑内容。重点在于重写规范:
- 必须满足自反性、对称性、传递性、一致性,且对 null 调用返回 false
- 若重写 equals,必须同步重写 hashCode,否则放进 HashMap 或 HashSet 会丢失或查不到
- 推荐用 Objects.equals(a, b) 避免空指针,比手动判 null 更安全
hashCode 不是随机数,但也不该手动算
它的核心作用是为哈希容器提供快速定位依据。JDK 8 后默认实现基于对象身份(非纯地址),但开发者不该依赖具体算法。关键点是:
- 相等的对象(equals 返回 true)必须有相同 hashCode
- 不相等的对象 hashCode 可以相同(哈希冲突允许,但应尽量减少)
- 字段参与计算时,优先用 Objects.hash(field1, field2),避免手写乘加公式出错
toString 重写是调试友好性的基本功
默认输出形如 Person@1b6d3586,对排查毫无帮助。实际项目中应:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 返回可读性强的格式,比如 Person{name='Alice', age=25}
- 避免在 toString 中触发复杂逻辑或 I/O(可能引发死锁或性能问题)
- 若对象含敏感字段(如密码),toString 中应脱敏,而不是直接打印原始值
wait/notify 必须和 synchronized 绑定使用
这三个方法定义在 Object 上,是因为锁属于对象本身,不是线程。常见错误包括:
- 在非同步上下文中调用 wait() → 抛 IllegalMonitorStateException
- 用 if 判断条件后 wait() → 可能发生虚假唤醒,应始终用 while 循环重检条件
- notify() 随机唤醒一个线程,若业务需全部响应(如批量任务完成通知),必须用 notifyAll()
clone 是个高危操作,慎用
它不是“复制对象”的通用解法,而是浅拷贝契约:
- 类必须实现 Cloneable 接口(否则抛 CloneNotSupportedException)
- clone() 是 protected 的,子类需显式改为 public 才能外部调用
- 数组、String、包装类等不可变类型浅拷贝安全;含 List/Map 等可变引用时,必须手动深拷贝或改用序列化、构造器等方式替代
finalize 已被废弃,别提“回收前清理”
JDK 9 开始标记为 @Deprecated,JDK 18 彻底移除。正确做法是:
- 资源释放统一走 try-with-resources(针对 AutoCloseable)
- 或在 finally 块中显式 close
- 若面试官问起,可补充:现代 JVM 不保证 finalize 调用时机和次数,依赖它等于埋雷
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










