在StringBuilder中字符串的长度总是小于等于构建器的容量。长度是存储在构建器中的字符串的实际大小,而容量是构建器的当前大小。如果有更多的字符添加到字符串构建器,超出他的容量,则构建器的容量就会自动增加。在计算机内部,字符串构建器是一个字符数组,因此,构建器的容量就是数组的大小。如果超出构建器的容量,就用新的数组代替现有数组,新数组的大小为2×(之前数组大小+1)。
public class Test {
public static void main(String[] args) {
StringBuilder s1 = new StringBuilder();
System.out.println(s1.capacity());
System.out.println(s1.length());
s1.append("abcd");
System.out.println(s1.capacity());
System.out.println(s1.length());
s1.append("abcdefghijklmnopqrstuvwxyz");
System.out.println(s1.capacity());
System.out.println(s1.length());
}
}
运行结果
16
0
16
4
34
30
无参构造方法的初始容量为16,当超出容量新数组的容量为2×(16+1)=34。
提示:
可以使用 new StringBuilder(initialCapacity)
创建指定容量的StringBuilder。通过仔细的选择初始容量能够使程序更高效。如果容量总是大于构造器的实际使用长度,JVM将永远不需要为构造器重新分配内存。另一方面,如果容量过大将会浪费内存空间。可以使用trimToSize()
方法将容量降到实际的大小。