java源码分析 ---- Object类

1.常用方法签名

//返回此Object运行时类型
(1)public final native Class<?> getClass();
//返回对象的哈希值
(2)public native int hashCode();
//判断其他对象是否与此对象"相等"
(3)public boolean equals(Object obj);
//返回此对象的字符串表示
(4)public String toString();
//唤醒在此对象监视器上等待的单个线程
(5)public final native void notify();
//唤醒在此对象监视器等待的所有线程
(6)public final native void notifyAll();
//在其他线程调用此对象的notify()方法或notifyAll()方法前,或者超过指定的时间量前,让当前线程等待
(7)public final void wait() throws InterruptedException;<pre name="code" class="java">(8)public final native void wait(long timeout) throws InterruptedException;
(9)public final void wait(long timeout, int nanos) throws InterruptedException
//当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法
(10)protected void finalize() throws Throwable;
 

2.方法具体内容

(1)equals方法

public String toString() {
      return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
由源码可知,Object的equals方法比较的是对象的地址是否相等,当且仅当两个引用x,y同时引用同一个对象时才能返回true,其他情况都返回false

equals方法在使用过程中常常被重写,重写时记得一下几点

(i)无论何时重写equals方法,都应该重写hashCode方法,来保证hashCode方法的约定,使得相等的对象必须具有相等的哈希值

(ii)由于Object是所有类的父类,所以重写的equals方法一定为public的

(iii)equals方法传入的参数类型一定为Object类型的,不要使用其他类型


正确的equals方法满足一下五个条件

(1)自反性。对任意x,x.equals(x)一定返回true
(2)对称性。对任意x和y,如果y. equals(x)返回true,则x.equals(y)也返回true
(3)传递性。对任意x,y,z,如果有x.equals(y)返回true,y.equals(x)返回true,则x.equals(z)一定返回true。
(4)一致性。对任意x和y,如果对象中用于等价比较的信息没有改变,那么无论调用x.equals(y)多少次,返回的结果应该保持一致。
(5)对任何不适null的x,x.equals(null)一定返回false。

(2)hashCode方法

public native int hashCode();

hashCode方法时一种本地方法,通常的实现方法是将成员变量与一个素数相乘,这样使其均匀分布,又能满足以下要求
(1)对同一个对象多次调用hashCode()时,在对象参与equals比较的成员,必须返回相同的整数<pre name="code" class="java">(2)同一个程序两次执行,该整数无需保持一致
(3)如果两个对象调用hashCode()返回的整数不同,对这两个对象进行equals方法比较必须返回false
(4)如果根据equals方法比较,两个对象等价时,那么在两个对象各自调用hashCode方法必须产生相同的整数结果
(5)如果根据equals方法比较,两个对象不等价时,那么在两个对象各自调用hashCode方法不一定产生相同的整数结果
 
 
 
 

(3)equals方法和hashCode方法的联系

系统一般判断的equals方法的规律是

如果hashCode相同,再自动判断equals方法返回值是否为true

如果hashCode不同,则equals方法直接返回false

因此二者的关系如下:

(i)如果equals方法返回true,hashCode返回值一定相同,如果hashCode()返回值不同,equals返回一定为false

(ii)如果重写了equals方法,必须重写hashCode,防止两个等价的对象返回的hashCode值不同,造成错误

(4)toString方法

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
由源码可知,toString方法返回的是一个字符串,内容为:  类名@哈希值


(5)notify和notifyAll方法

public final native void notify();
public final native void notifyAll();

notify方法是唤醒一个正在等待对象监视器的线程,而且只能唤醒一个,而且是随机唤醒

notifyAll方法是唤醒所有正在等待对象监视器的线程


(6)wait(),wait(long),wait(long,int)

public final native void wait(long timeout) throws InterruptedException;
<pre name="code" class="java">public final void wait() throws InterruptedException {
        wait(0);
}
 
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 >= 500000 || (nanos != 0 && timeout == 0)) {
            timeout++;
        }

        wait(timeout);
}

wait方法导致当前线程等待,直到其他线程调用该同步监视器的notify方法或者notifyAll方法。
如果当前线程不是此对象监视器所有者,将抛出IllegalMonitorStateException异常。
如果在当前线程等待通知之前或者正在等待通知时,任何线程终端了当前线程。都会抛出InterruptedException异常。

(7)finalize方法

protected void finalize() throws Throwable { }

当JVM已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。
对于任何给定对象,JVM最多只调用一次 finalize 方法。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值