Java.lang.Object类方法分析

Object类是所有类的最终父类。
其中的一些方法都非常关键,下面仔细来说明。

方法

hashCode()

Java 中的 hashCode 方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。在 Java 中,hashCode 主要是为了配合基于散列的集合一起正常运行,包括 HashTable, HashMap ,HashSet 。
这里可以参考 HashMap 的原理来看:http://blog.csdn.net/yx0628/article/details/79323985
在向集合中插入对象时,比如不允许重复对象,那么要判断集合中是否已经存在该对象。使用 equals 方法逐个比较的话,当集合中已经存在大量的数据时,不可能每次都一一比较,太影响效率。所以,每次添加时,使用 hashCode 方法,得到对应的 hashcode 的值,比如在 HashMap 中,会有 table 来保存已经存入对象的 hashcode 值,那么如果 table 中没有该 hashcode 值,就可以直接存进去,如果 table 中已经存在这个 hashcode(那么这个位置的”桶“中的所有对象,都是 hashcode 相同但对象不同的,HashMap 会通过链表来解决同一个位置的冲突问题,hashcode 相同的不同对象一个个链接起来),那么再调用 equals 方法对这些 hashcode 相等的对象和新对象进行比较,如果 equals 找到相同的说明是重复元素,而如果 equals 都不等,该元素就添加到这个桶中的链表尾部。

    public native int hashCode();

equals()

equals 方法是用来比较两个引用是否引用了同一个对象。在实际中,往往要比较两个对象是否相等,所以一般会对 equals 方法进行重写。
如果两个对象相等,即 equals 方法返回 true,那么这两个对象的 hashcode 的值一定相同。所以在重写 equals 方法时,对象的 hashCode 方法也要重写,并且产生 hashCode 使用的对象,一定要和 equals 方法中使用的一致。
另外 hashcode 一致的两个对象,不一定 equals 就相等,就像上边例子中的,hashcode 相等的会放在 HashMap 的同一个桶中的。

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

clone()

这个 clone 方法会为目标对象创建一个新的对象,基本数据类型重新产生,但是对象中对其他对象的引用是浅拷贝的,也就是说复制的还是引用,涉及的其他对象并没有都重新创建新对象。在必要时子类也可以进行重写。

    protected native Object clone() throws CloneNotSupportedException;

toString()

toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、标记符“@”和此对象哈希码的无符号十六进制表示组成。所有子类都建议重写此方法。

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

多线程几个方法

关于 notify 和 notifyAll 和 wait 等设计多线程的方法,需要清楚对象锁的概念。
对象锁可以参考文章:http://blog.csdn.net/yx0628/article/details/79126384http://blog.csdn.net/yx0628/article/details/79086511

    // 唤醒等待获取此对象锁的单个线程
    public final native void notify();
    // 唤醒等待获取此对象锁的所有线程
    public final native void notifyAll();
    // 一直等待,直到出现两种情况结束等待:
    // 1.其他线程调用此对象的 notify() 方法或 notifyAll() 方法
    // 2.超过指定的时间量timeout
    public final native void wait(long timeout) throws InterruptedException;
    // 即wait(0)没有指定时间,只能通过等待获取对象锁,即上边的情况1
    public final void wait() throws InterruptedException {
        wait(0);
    }
    // 多加了一个纳秒参数,更精确控制等待时间
    // 大于半毫秒的加1毫秒,
    public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
        // 纳秒小于0和纳秒为1毫秒都不合理
        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }
        // 只要纳秒大于0,timeout就要在当前基础上再加1毫秒
        if (nanos > 0) {
            timeout++;
        }

        wait(timeout);
    }

finalize()

垃圾回收器准备释放内存的时候,会先调用 finalize 方法。

    protected void finalize() throws Throwable { }

其它方法

    // 一个本地方法,静态块中代码在对象初始化时自动调用此方法
    private static native void registerNatives();
    static {
        registerNatives();
    }

    // 返回对象的运行时类
    public final native Class<?> getClass();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值