文章目录

今天,来分享下 StringBuilder 与 StringBuffer 动态扩容机制。

基于 JDK 7 进行源码分析。

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 的时候指定大小,这样可以避免在容量不够的时候自动增长,从而提高性能。

(完)

微信公众号

文章目录