java Object 类解析
1. object类大家都知道,在java.lang.Object中,object类是所有类的超类,包括数组都implement object类。
2.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;
protected void finalize() throws Throwable { }
具体可以查看jdk这种object的源码,下面就部分进行详细描述。
3.native 关键字
该关键字在开发中不被频繁使用,native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不在当前文件,而是再用其他语言,我们知道java不能直接对操作系统进行访问和操作,但是可以通过JNI(java native interface)接口调用c语言实现对底层的访问。
详细的使用可参照博客:https://www.cnblogs.com/b3051/p/7484501.html
4.hashCode()和equals()
为什么object类上有hashcode,它的作用是什么,hashcode和equals怎么配合使用、equals使用时的注意事项等。这里可以有一连串的笔试面试问题。
hash:哈希,我们都听过,但到底什么是哈希?带这些问题本人深入了解类一下。哈希(散列)大概是value = hash(key),主要作用:将任意长度的数据映射到有限的长度的域,hash算法的产生方式大体可以分为三种基本方法:加法,乘法和移位。
具体实现可参照博客:https://www.cnblogs.com/coder2012/p/3954736.html,这人评价还不错。
这里hashcode()返回的是该对象的一个唯一的hash值,对象稍微改对应的hash值亦发生变化。通过比较hashcode()返回值和调用equals()方法,程序程序就可以判断用一个对象在运行过程是否发生变化。
注意:一般重写equals方法时需要重写hashcode(),而且需要注意equals()需要满足的条件
简单来讲就是判断相等的条件就是:
(1)自反性:任何不为空的引用值x,x.equals(x) 返回ture
(2) 对称性:任何不为空的引用值x和y,x.equals(y)返回ture当且仅当y.equals(x)为true.
(3) 传递性:任意不为空的引用值x、y、z,x.euqals(y)而且y.equals(z),x.equals(z)返回true.
(4)一致性:对于任何非空引用值x和y,对x.equals(y)的多次调用始终返回true或始终返回false,前提是在对对象的equals比较中不使用任何信息进行修改.
(5) 对任何不为空的引用值x,x.equals(null)返回false.
5.toStringa()
返回class对象@hashcode
6.notify()、notifyAll()、wait()
以上方法都是用在控制线程状态:
notify():唤醒一个正在等待这个对象的线程,通俗来讲就是某一个持有对象锁的线程准备释放对象锁权限(同一个对象同一时间只能由一个线程使用,不然会出现数据不一致的情况),这个时候jvm唤醒一个正在等待的线程,直到之前线程结束Synchronized代码块作用域时,新线程获得对象锁,其他线程仍然等待。
notifyAll();唤醒所有等待这个对象的线程,持有对象锁的线程正准备释放对象锁权限,通知jvm唤醒所有等待线程,之前的线程结束Synchronized代码块,JVM通过算法将对象锁指派给某一个线程,这里涉及到锁池和等待池;简单解释一下
锁池(monitor):简单理解就是一个对象正在被一个线程使用,其对象锁状态为使用中,其他线程需要使用这个对象需要等待。
等待池(wait):某一线程释放该对象的对象锁,调用wait()方法后就会进入该对象的等待池中,等待notify()或者notifyAll()h唤醒进入锁池等待执行(processed)。
注意:尽量使用notifyAll(),notify()容易发生死锁。
..