Object源码阅读

来源:互联网 发布:js 二维数组匹配 编辑:程序博客网 时间:2024/04/26 19:00

Object源码阅读

native关键字:通过native标识的方法通过JNI(尤其针对Java与C/C++沟通的工具)编译生成头文件接口,本地语言实现接口进行底层调用,编译生成“实现文件名.dll”文件,在native方法所在类中加入System.loadLibrary(”实现文件名”)语句,加载本地方法实现的dll

本地方法实现:getClass、hashCode、clone、notify、notifyAll、wait

getClass方法:final修饰返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。

hashCode方法:equals相等的对象,hashCode一定相同;不相等的对象,不要求一定不同(但建议这么做以提高哈希表的性能),一般通过将内部地址转换为一个整数来实现。

hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。
这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,
当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,
导致混淆,因此,就也需要重写hashcode()

equals方法:Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 重写equals时建议同时重写hashCode,避免出现equals相等的对象hashCode确不同的情况

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

clone方法:protected修饰,重写需实现Cloneable接口。复制一个份数据生成新对象(而不是赋值指向被克隆对象的引用,防止克隆体改变原对象)。分深度克隆(包括引用类型克隆)和浅克隆(基本数据类型克隆,引用数据类型复制引用)概念,引用对象为不可变对象时使用浅克隆。相关知识点:原型模式

toString方法:返回“类名@此对象哈希码的无符号十六进制表示”,建议所有类重写此方法

notify方法:唤醒线程。从等待状态到锁定状态。

notifyAll方法:唤醒全部线程

wait方法:将线程放等待集中(等待一段时间),同时放弃所有同步要求,处于休眠状态(禁用)。

  1. 唤醒条件:Object.notify()、Object.notifyAll()、Thread.interrupt()、timeout时间片到
  2. 重载:

wait()同wait(0)

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

wait(long timeout) native修饰,本地方法实现
wait(long timeout, int nanos) 加了一个毫秒微差值 1000000*timeout+nanos,更精确

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

finalize方法

0 0
原创粉丝点击