源码阅读系列——java.lang

源码阅读系列——java.lang

  • Object
  • 八大基本类型的包装类型
  • String、StringBuilder、StringBuffer

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是不太合适的。
String源码
StringBuilder和StringBuffer。两者均继承于AbstractStringBuilder天生为了字符串匹配,但是StringBuffer与StringBuilder相比,StringBuilder没有任何的同步策略,而StringBuffer却是加了synchronized修饰的。因此线程安全。同时StringBuffer在多线程的情况下使用了一个cache来获取进行拷贝获取字符串中内容,同时申请一个大小为字符串长度 + 16的数组。两者的扩容大小都是 cap*2 + 2。
源码阅读系列——java.lang_第1张图片

你可能感兴趣的:(JDK源码,源码,jdk,object,String,StringBuilder)