今天,来分享下 StringBuilder 与 StringBuffer 动态扩容机制。
StringBuilder 与 StringBuffer 的构造方法会创建一个默认大小是 16 的字符数组。
无参构造方法,如下所示。
public StringBuilder() {
super(16);
}
有参构造方法,如下所示。
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
使用 append() 方法时,如果长度超过了字符串存储空间大小就需要进行扩容,调用 expandCapacity() 方法,尝试 将新容量扩为大小变成 2 倍 + 2,直接扩充到需要的容量大小 。
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
总结下,StringBuilder 与 StringBuffer 的构造方法会创建一个默认大小是 16 的字符数组。使用 append() 方法时,如果长度超过了字符串存储空间大小就需要进行扩容,它会重新分配内存,创建一个更大的数组,这个数组的容量是原来的 2 倍 + 2 的大小,并将原先的数组复制过来,再丢弃旧的数组。因此,在大多数情况下,可以在创建 StringBuilder 与 StringBuffer 的时候指定大小,这样可以避免在容量不够的时候自动增长,从而提高性能。
(完)