1、创建并返回一个对象的拷贝
protected Object clone()
clone
方法是浅拷贝,对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存,相对应的深拷贝则会连引用的对象也重新创建。
2、比较两个对象是否相等
boolean equals(Object obj)
Object equals()
方法用于比较两个对象是否相等。
equals()
方法比较两个对象,是判断两个对象引用指向的是同一个对象,即比较 2 个对象的内存地址是否相等。
注意:如果子类重写了 equals()
方法,就需要重写 hashCode()
方法,比如 String
类就重写了 equals()
方法,同时也重写了 hashCode()
方法。
3、实例被垃圾回收器回收
protected void finalize()
Object finalize()
方法用于实例被垃圾回收器回收的时触发的操作。
当 GC (垃圾回收器)确定不存在对该对象的有更多引用时,由对象的垃圾回收器调用此方法。
4、获取对象的运行时对象的类
Class<?> getClass()
Object getClass()
方法用于获取对象的运行时对象的类。
5、获取对象的 hash 值
int hashCode()
Object hashCode()
方法用于获取对象的 hash 值。
6、唤醒在该对象上等待的某个线程
void notify()
Object notify()
方法用于唤醒一个在此对象监视器上等待的线程。
如果所有的线程都在此对象上等待,那么只会选择一个线程,选择是任意性的,并在对实现做出决定时发生。
一个线程在对象监视器上等待可以调用 wait()
方法。
notify()
方法只能被作为此对象监视器的所有者的线程来调用。
一个线程要想成为对象监视器的所有者,可以使用以下 3 种方法:
- 执行对象的同步实例方法
- 使用
synchronized
内置锁 - 对于
Class
类型的对象,执行同步静态方法
注意:一次只能有一个线程拥有对象的监视器。
如果当前线程不是此对象监视器的所有者的话会抛出 IllegalMonitorStateException
异常。
7、唤醒在该对象上等待的所有线程
void notifyAll()
Object notifyAll()
方法用于唤醒在该对象上等待的所有线程。
notifyAll()
方法跟 notify()
方法一样,区别在于 notifyAll()
方法唤醒在此对象监视器上等待的所有线程,notify()
方法是一个线程。
如果当前线程不是对象监视器的所有者,那么调用 notifyAll()
方法同样会发生 IllegalMonitorStateException
异常。
8、返回对象的字符串表示形式
String toString()
Object toString()
方法用于返回对象的字符串表示形式。
9、让当前线程进入等待状态
void wait()
Object wait()
方法让当前线程进入等待状态。直到其他线程调用此对象的 notify()
方法或 notifyAll()
方法。
当前线程必须是此对象的监视器所有者,否则还是会发生 IllegalMonitorStateException
异常。
如果当前线程在等待之前或在等待时被任何线程中断,则会抛出 InterruptedException
异常。
10、让当前线程处于等待(阻塞)状态
void wait(long timeout)
Object wait(long timeout)
方法让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify()
方法或 notifyAll()
方法,或者超过参数 timeout
设置的超时时间。
如果 timeout
参数为 0,则不会超时,会一直进行等待,类似于 wait()
方法。
当前线程必须是此对象的监视器所有者,否则还是会发生 IllegalMonitorStateException
异常。
如果当前线程在等待之前或在等待时被任何线程中断,则会抛出 InterruptedException
异常。
如果传递的参数不合法,则会抛出 IllegalArgumentException
异常。
11、让当前线程处于等待(阻塞)状态
void wait(long timeout, int nanos)
与 wait(long timeout)
方法类似,多了一个 nanos
参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos
纳秒。。