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