Java根基类Object类源码探索

版权声明:欢迎转载大宇的博客,转载请注明出处: https://blog.csdn.net/yanluandai1985/article/details/87100838

Object类源码

        native关键字修饰的方法是原生方法,由C / C++ 语言实现。

        Object中共有12个方法,其中关于多线程的方法有5个。

        主要方法有 hashCode() 、 equals() 、 clone() 、 toString() 、 getClass()  、 finalize()。

hashCode 方法 是一个原生方法,获取对象哈希值。

equals 比较对象的内存地址是否相同。通常被子类重写。

clone   方法涉及浅克隆与深克隆。Object类中的clone方法是浅克隆。

toString 返回该对象的字符串表示

getClass 获取类的字节码文件

finalize  用于垃圾回收,finalize并不保证执行以后就会把内存释放掉,而是会到执行后的下一次垃圾回收才有机会被回收掉。

package java.lang;

public class Object {

    private static native void registerNatives();

    static {
        registerNatives();
    }

    public final native Class<?> getClass();

    public native int hashCode();

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

    protected native Object clone() throws CloneNotSupportedException;

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

    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 {
        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);
    }

    public final void wait() throws InterruptedException {
        wait(0);
    }

    protected void finalize() throws Throwable {
    }
}

相关的面试题

(1)Object类中经常被重写的方法 

        hashcode 、 equals 、toString

(2)为什么要重写hashCode与equals方法       

        首先要明白的是hashCode与equals方法的基本作用。

        hashCode返回的是对象的内存地址,equals方法比较的是两个对象是否相等,在Object类中默认是比较的两个对象的内存地址。它们共同用于比较两个对象是否相等。

        我个人理解为什么要重写hashCode与equals方法。为了提升程序的效率才重写hashCode与equals方法。在比较对象的时候,先比较hashCode,如果hash值不一样,那么没必要在进行比较了。如果hash值一样,那么再比较equals方法。这样的好处就是可以大量减少比较equals方法的次数。常见的要重写hashCode与equals方法的例子就是在集合框架中。

         在集合框架中,Set集合是无序的,不可以重复的。为了保证元素的唯一性,新插入一个元素的时候,先计算它的hash值,然后通过这个哈希值定义到一个地址上。然后看看这个地址上有没有元素。如果没有的话,那么就直接插入。如果有的话,那么再比较equals方法。这样设计的好处就是可以减少equals方法的比较次数,从而提升Set集合的插入效率。

         所以,简单说,重写hashCode与equals方法就是为了:提升比较两个对象是否相同的效率。

(3)浅克隆与深克隆

        浅克隆是指:复制一个对象,如果这个对象的成员变量是一个引用数据类型,那么会把这个成员变量的内存地址拷贝一份给复制的对象。

        深克隆是指:把这个引用数据类型的成员变量,重新创建一个新的对象,赋值给克隆出来的对象。

        对于8种基本数据类型而言,浅克隆与深克隆都重新拷贝了一份。

        如果想要深拷贝一个对象, 它的成员变量都要实现cloneable接口,所以,深克隆很难实现,基本上所有的克隆都是浅克隆。
 

               

猜你喜欢

转载自blog.csdn.net/yanluandai1985/article/details/87100838