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接口,所以,深克隆很难实现,基本上所有的克隆都是浅克隆。