Object常用方法详解(12大常用方法) – mikechen

Object常用方法详解(12大常用方法) – mikechen

在Java中,Object类是所有类的超类,有12大方法。

public class Object {

public Object() {}

public final native Class getClass();

public native int hashCode();

public boolean equals(Object obj);

protected native Object clone() throws CloneNotSupportedException;

public String toString();

public final native void notify();

public final native void notifyAll();

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException;

public final void wait() throws InterruptedException;

protected void finalize() throws Throwable { }

}

equals(Object obj)

比较两个对象是否相等,使用引用比较,只有当两个对象的引用相同时才返回true。

Object obj1 = new Object();

Object obj2 = new Object();

Object obj3 = obj1;

System.out.println(obj1.equals(obj2)); // false

System.out.println(obj1.equals(obj3)); // true

但是,许多类会重写这个方法,以提供基于内容的比较。

@Override

public boolean equals(Object obj) {

if (this == obj) {

return true;

}

if (obj == null || getClass() != obj.getClass()) {

return false;

}

MyClass other = (MyClass) obj;

return Objects.equals(this.someField, other.someField);

}

hashCode()

返回对象的哈希码,返回一个本地方法生成的整数,通常与对象的内存地址有关。

例如:HashMap,就会使用到hashcode来定位数据存储位置。

当重写equals方法时,也应重写hashCode方法,以确保相等的对象具有相等的哈希码。

@Override

public int hashCode() {

return Objects.hash(someField);

}

clone()

创建并返回当前对象的一个副本,需要实现Cloneable接口,默认实现:创建对象的浅表副本。

class MyClass implements Cloneable {

@Override

protected Object clone() throws CloneNotSupportedException {

return super.clone();

}

}

finalize()

在垃圾回收器回收对象之前调用,用于清理资源。

@Override

protected void finalize() throws Throwable {

try {

// 清理资源

} finally {

super.finalize();

}

}

getClass()

返回对象的运行时类。

Object obj = new Object();

System.out.println(obj.getClass()); // class java.lang.Object

notify(), notifyAll(), wait()

notify():唤醒一个正在等待该对象监视器的线程。

notifyAll():唤醒所有正在等待该对象监视器的线程。

wait():使当前线程等待,直到其他线程调用notify()或notifyAll()。

synchronized(obj) {

obj.wait();

}

synchronized(obj) {

obj.notify();

}

wait(long timeout), wait(long timeout, int nanos)

使当前线程等待指定时间或直到被唤醒。

synchronized(obj) {

obj.wait(1000); // 等待1秒

}

相关推荐