01-StringBuilder 源码分析

public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append((String) null);
        sb.append("1234567890");

StringBuilder 源码分析 jdk 1.8

  • StringBuilder sb = new StringBuilder();源码
// 源码
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
    /**
     * string builder 构造器,设置初始容量为16
     */
    public StringBuilder() {
        super(16);
    }
}
// super 指向 抽象类AbstractStringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
    * 底层为char数组
    */
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }
}
  • sb.append("1234567890"); 源码
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
}
// super.append 指向 抽象类AbstractStringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence {
    // StringBuilder 的长度
    int count;

    // 底层为char数组
    char[] value;

    public AbstractStringBuilder append(String str) {
        // 判断字符串是否为空
        if (str == null)
            // 调用appendNull方法
            return appendNull();
        // 获取字符串长度
        int len = str.length();
        // 确认容量 - 设置char数组容量
        ensureCapacityInternal(count + len);
        // 将字符串的char数组拷贝到当前char数组
        /*
        Params:
            0 – 开始索引
            len – 结束索引
            value – 即将更新的char数组
            count – 即将更新的char数组的起始索引
        */
        str.getChars(0, len, value, count);
        // StringBuilder的长度
        count += len;
        return this;
    }


    private AbstractStringBuilder appendNull() {
        int c = count;
        // 确认容量
        ensureCapacityInternal(c + 4);
        final char[] value = this.value;
        value[c++] = 'n';
        value[c++] = 'u';
        value[c++] = 'l';
        value[c++] = 'l';
        count = c;
        return this;
    }

    // minimumCapacity 为即将添加的char数组长度
    private void ensureCapacityInternal(int minimumCapacity) {
        // overflow-conscious code
        // 判断是否超过char数组长度
        // value.length 是当前char数组长度
        if (minimumCapacity - value.length > 0) {
            // 即将添加的字符串长度大于当前char数组长度
            // Arrays.copyOf 是拷贝新的char数组,参数为【原数组,新数组长度】
            value = Arrays.copyOf(value,
                    newCapacity(minimumCapacity));
        }
    }

    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8 = 2147483639

    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        // 设置新的char数组容量:【当前char数组长度 * 2 + 2】
        int newCapacity = (value.length << 1) + 2;
        if (newCapacity - minCapacity < 0) {
            // 如果新的char数组容量 < 即将添加的char数组长度,则容量 = 即将添加的char数组长度
            newCapacity = minCapacity;
        }
        // 判断容量是否超过最大值:超过就调用hugeCapacity方法
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    }

    private int hugeCapacity(int minCapacity) {
        if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
            // 如果即将添加的char数组容量超过最大值,抛出内存溢出异常
            throw new OutOfMemoryError();
        }
        // 判断即将添加的char数组容量 > MAX_ARRAY_SIZE
        return (minCapacity > MAX_ARRAY_SIZE)
            ? minCapacity : MAX_ARRAY_SIZE;
    }
}

总结

StringBuilder 是一个可变的字符序列,容量默认为 16,当容量不够时,会扩容为【当前容量 * 2 + 2】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值