源码阅读系列——java.lang

本文深入探讨了Java中的Object类,揭示了八大基本类型包装类的装箱和拆箱原理,特别是对于Double、Char等类的缓存优化策略。此外,还详细分析了String的不可变性以及在字符串长度变化时的效率问题。最后,对比了StringBuilder和StringBuffer在多线程环境下的性能和线程安全性差异,包括它们的扩容策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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。
AbstractStringBuilder

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值