在学习java的过程中,总会手工敲一些代码验证自己的猜想,不久前就遇到这么一个问题。
import java.util.*;
import java.lang.*;
public class Main{
public static void main(String[] args){
StringBuffer str = new StringBuffer();
str.append("abc");
System.out.println(str.length());
System.out.println(str.capacity());
str.append("defghijklmnopq");
System.out.println(str.length());
System.out.println(str.capacity());
}
}
输出结果如下:
3
16
17
34
不知道为何capacity的值会从16直接跳到34,查了一下资料,得出以下结论:
StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候, StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容 量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值+2)。
如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第17个字符的时候它会将容量增加到34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。无论何事只要StringBuffer 到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍。所以给 StringBuffer设置一个合理的初始化容量值,会提升程序的性能。