Object源码学习笔记
一、Object类拥有的方法:
-
registerNatives():注册本地方法 在Object的Static块里,说明类加载时要加载本地方法
-
getClass():获取Class对象 注意和类名.class的区别
@Test public void testClass(){ Parent p = new Son(); System.out.println(p.getClass()); // class com.ys.test.Son 运行时对象 System.out.println(Parent.class); // class com.ys.test.Parent 编译时对象 }
-
hashCode():获取对象的哈希码
hashCode的要求: 两个对象相等,其 hashCode 一定相同; 两个对象不相等,其 hashCode 有可能相同; hashCode 相同的两个对象,不一定相等; hashCode 不相同的两个对象,一定不相等; 对于 Map 集合,我们可以选取Java中的基本类型,还有引用类型 String 作为 key, 因为它们都按照规范重写了 equals 方法和 hashCode 方法。但是如果你用自定义对象作为 key, 那么一定要覆写 equals 方法和 hashCode 方法,不然会有意想不到的错误产生。
-
equals():比较方法 在Object里equals和==等价,都是比较对象的引用地址,如果两个对象的引用相等,那么这两个对象一定是相等的
这里可以看下String类重写的equals方法
public boolean equals(Object anObject) { // 如果引用相同,则2个对象一定相同 if (this == anObject) { return true; } // 如果另一个对象是String才比较 if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; // 2个对象长度相等才比较 if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; // 比较每个字符,每个字符都相等才返回true while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
-
clone():克隆方法,这里可以配合浅拷贝和深拷贝理解
浅拷贝(Shallow Copy):基本类型值传递,引用类型传递引用(拷贝与被拷贝对象修改都会影响到对方) 深拷贝:引用对象的值等信息,复制一份一样的。 直接调用super.clone()方法是浅拷贝,如果想实现深拷贝,可以对内部的对象变量再次调用clone方法
-
toString() :Object中的toString():类名+hashCode,大多数的集合类都重写了toString方法
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
-
notify():随机唤醒一个在等待队列的线程
-
notifyAll():唤醒在等待队列的全部线程
-
wait():让当前线程加入等待队列
-
finalize():释放资源方法(在GC的时候会自动调用) 不建议手动调用