public StringBuilder() {   //默认的容量是 16
super(16);
}
public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);    //count 表示当前stringbuilder 对象的长度  len 表示要添加对象的长度
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }

private void ensureCapacityInternal(int minimumCapacity) {  //用来判断添加进来的对象加上原来的对象长度 是否大于value.length() 刚开始是16 
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}

private int newCapacity(int minCapacity) {        //如果大于的话 就增加容量  (value.lenght << 1 ) + 2 左移一位 相当于乘以2 得到 34 
// overflow-conscious code
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) {      //如果34 小于 最小的容量(添加进来的对象加上原来的对象长度) 那么新的容量就是最小的容量
        newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}

  总结: stringBuilder 扩容的时候,容量不一定是 16*2 + 2

01-25 01:34