外观
object 类常见的方法
⭐ 题目日期:
美团 - 2024/12/23
📝 题解:
在Java中,Object
类是所有类的根父类,其方法被所有对象继承。以下是Object
类的核心方法及其作用:
1. 基础方法
(1) equals(Object obj)
- 作用:比较两个对象是否“逻辑相等”(默认比较内存地址,需重写)。
- 示例:
public boolean equals(Object obj) { return (this == obj); // 默认实现(地址比较) }
- 重写规则:
- 自反性:
x.equals(x)
必须为true
。 - 对称性:若
x.equals(y)
为true
,则y.equals(x)
必须为true
。 - 传递性:若
x.equals(y)
和y.equals(z)
为true
,则x.equals(z)
必须为true
。 - 一致性:多次调用结果应相同(不依赖可变状态)。
- 非空性:
x.equals(null)
必须为false
。
- 自反性:
(2) hashCode()
- 作用:返回对象的哈希码,用于哈希表(如
HashMap
)。 - 与
equals()
的契约:- 若
x.equals(y)
为true
,则x.hashCode() == y.hashCode()
。 - 哈希码不同时,
equals()
必为false
。
- 若
- 示例:
public native int hashCode(); // 默认返回对象内存地址的哈希
(3) toString()
- 作用:返回对象的字符串表示(默认格式:
类名@哈希十六进制
)。 - 重写示例:
public String toString() { return "Person{name=" + name + ", age=" + age + "}"; }
2. 多线程相关方法
(1) wait()
/ wait(long timeout)
/ wait(long timeout, int nanos)
- 作用:让当前线程进入等待状态,直到其他线程调用
notify()
/notifyAll()
或超时。 - 使用条件:必须在
synchronized
代码块中调用(否则抛IllegalMonitorStateException
)。 - 示例:
synchronized (lock) { while (!condition) { lock.wait(); // 释放锁并等待 } }
(2) notify()
/ notifyAll()
- 作用:唤醒在同一个锁上等待的单个线程(
notify()
)或所有线程(notifyAll()
)。 - 示例:
synchronized (lock) { condition = true; lock.notify(); // 唤醒一个等待线程 }
3. 类型与生命周期
(1) getClass()
- 作用:返回对象的运行时类(
Class
对象),反射机制的基础。 - 示例:
Object obj = new String("Hello"); Class<?> clazz = obj.getClass(); // 返回 String.class
(2) finalize()
- 作用:对象被垃圾回收前由JVM调用(不推荐依赖,资源释放应使用
try-with-resources
或显式关闭)。 - 问题:
- 执行时间不确定,可能导致资源泄漏。
- JDK 9+已标记为
@Deprecated
。
4. 对象克隆
clone()
- 作用:创建并返回对象的副本(浅拷贝)。
- 使用条件:需实现
Cloneable
接口(否则抛CloneNotSupportedException
)。 - 示例:
public class Person implements Cloneable { @Override public Object clone() throws CloneNotSupportedException { return super.clone(); // 浅拷贝 } }
总结:Object类方法列表
方法 | 作用 | 常见用途 |
---|---|---|
equals(Object obj) | 对象逻辑相等性比较 | 重写以支持内容比较(如String 、自定义类) |
hashCode() | 生成哈希码 | 哈希表键值设计(如HashMap ) |
toString() | 对象字符串表示 | 调试、日志输出 |
wait() , notify() 等 | 线程间通信 | 生产者-消费者模型 |
getClass() | 获取运行时类 | 反射、类型检查 |
clone() | 对象克隆(浅拷贝) | 复制对象状态 |
finalize() | 垃圾回收前清理(已弃用) | 不推荐使用 |
注意事项
- 重写
equals()
必须重写hashCode()
:确保哈希表操作正确性。 - 线程安全:
wait()/notify()
必须在同步上下文中使用。 - 深拷贝与浅拷贝:
clone()
默认浅拷贝,需手动实现深拷贝逻辑。 - 避免依赖
finalize()
:优先使用AutoCloseable
接口管理资源。