源码阅读系列——java.lang
java.lang是平时用的比较多的包之一,但是内容比较简单,所以我就放到这里了。
Object
Object类是平时用的最多的类——因为是所有方法的父类。随着源码来看看
package java.lang;
public class Object {
/**
* 返回方法运行时的java.lang.Class对象.
*/
public final native Class<?> getClass();
/**
* 返回类的Hash值,Hash值在有的工具类中使用的比较多。例如Hashtable,HashMap;
* hashCode原则
* 1、同一个的程序中,相同对象的Object在不同时刻相等
* 2、如果两个对象的equals方法返回true,那么他们的hashCode要想等。
* 3、如果两个对象的equals方法返回false,那么他们的hashCode可以不相等。
*/
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
/**
* 返回一个类的副本。默认是浅复制
*/
protected native Object clone() throws CloneNotSupportedException;
/**
* 返回代表该对象的字符串,默认是类名+@+hashCode()
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
/**
* 多线程使用,唤醒释放锁wait的线程。
*/
public final native void notify();
/**
* 多线程使用,notify唤醒一个,而notifyAll唤醒多个。
*/
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 > 0) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
}
八大基本类型的包装类型
查看源码发现八大数据类型还是很像的。包装类知识点:拆箱与装箱
装箱:将基本数据类型用valueOf方法进行包装成基本数据类型,其中Double,Char,Byte,Long,Integer,Short都会缓存,代码中的注释说的是如果创建新的对象不是必须的,那么就采用事先的缓存,从而提升空间利用率。但是Float和Double没有,因为任意两个浮点数中间的数都是无穷多个。
拆箱:将包装类型转化为基本数据类型。
String、StringBuilder、StringBuffer
String中维护了一个final修饰的char数组。所以String是不可变的,当数字符串长度不定的时候(不停扩容),使用String是不太合适的。
StringBuilder和StringBuffer。两者均继承于AbstractStringBuilder天生为了字符串匹配,但是StringBuffer与StringBuilder相比,StringBuilder没有任何的同步策略,而StringBuffer却是加了synchronized修饰的。因此线程安全。同时StringBuffer在多线程的情况下使用了一个cache来获取进行拷贝获取字符串中内容,同时申请一个大小为字符串长度 + 16的数组。两者的扩容大小都是 cap*2 + 2。