Object类的方法总结

115 阅读3分钟

Object类的方法

image.png

  1. getClass():返回此 Object 的运行时类。native方法
  2. hashCode():用于返回对象的hash值,native方法。
  3. equals():指示其他某个对象是否与此对象“相等”。如果没有重写,Object类中默认使用 ‘==’来比较两对象。
  4. clone():克隆一个对象,有深克隆和浅克隆之分。
  5. toString():返回一个对象的字符串表示。对象信息输出。
  6. finalize():当垃圾回收器将要回收对象所占内存时,该方法被调用,即当一个对象被虚拟机宣告死亡时会先调用它的finalize()方法,让此对象临终前交代点遗言,当然对象也可以趁机复活。
  7. wait():用于暂停线程的执行。释放锁和cpu。
  8. notify/notifyAll():唤醒一个/所有等待的线程获取资源

源码

equale源码:

public boolean equals(Object obj) {
    return (this == obj);
}

tostring

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

wait可以设置时间参数,也可以不设置

public final void wait() throws InterruptedException {
    wait(0);
}
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
    if (timeout < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
                            "nanosecond timeout value out of range");
    }

    if (nanos > 0) {
        timeout++;
    }

    wait(timeout);
}

进一步解释

toString

toString会默认返回 ToStringExample@4554617c 这种形式,其中 @ 后面的数值为散列码的无符号十六进制表示。

clone

clone() 是 Object 的 protected 方法,它不是 public,一个类不显式去重写 clone(),其它类就不能直接去调用该类实例的 clone() 方法。

clone() 方法并不是 Cloneable 接口的方法,而是 Object 的一个 protected 方法。Cloneable 接口只是规定,如果一个类没有实现 Cloneable 接口又调用了 clone() 方法,就会抛出 CloneNotSupportedException。

重写clone方法可以实现浅拷贝和深拷贝。

clone() 方法来拷贝一个对象即复杂又有风险,它会抛出异常,并且还需要类型转换。最好不要去使用 clone(),可以使用拷贝构造函数或者拷贝工厂来拷贝一个对象。

相关问题

equalse、==、hashcode

首先是equals和==
==就是比较传入的双方是否相等,比较基本数据类型时是比较的值,比较引用数据类型时,是比较引用地址。 equalse看上面的源码就能知道在object类中使用equals就是使用==来比较,所以如果使用的类没有重写equals则就是使用==来比较,不然就是使用重写的方法来比较。equals由于参数限定所以无法比较基本数据类型。 equals和hashcode hashcode是根据对象来生成对应的int类型的整数。所以可以使用hashcode来判断对象是否相等。若俩对象生成的hashcode值不同,则可以认为俩对象不同。hashcode也可以用来判断对象是否相同。 但值相等不能说明两对象一定是同一个对象,因为hash算法有碰撞的可能,算法越差碰撞可能性就越高。
为什么要提供这两个方法?
hashcode运算效率比equals高,在一些容器中先使用hashcode进行比较可以提高效率。
为什么重写 equals() 时必须重写 hashCode() 方法? 相同的对象equals结果是相等hashcode的结果也应该是相等。如果只重写了equals方法则可能euqals判断相等的对象hashcode判断为不相等。