他们的相同点都是继承了AbstractStringBuilder类,所有方法基本相同,但是StringBuffer是线程安全的,方法前有synchronized关键字。他们的初始化大小都是16,扩容机制是新容量=(旧容量+1)×2[code=java]public StringBuilder() {
super(16);
}[/code][code=java]public StringBuffer() {
super(16);
}[/code][code=java] void expandCapacity(int minimumCapacity) {
int newCapacity = (value.length + 1) * 2;
if (newCapacity < 0) {
newCapacity = Integer.MAX_VALUE;
} else if (minimumCapacity > newCapacity) {
newCapacity = minimumCapacity;
}
value = Arrays.copyOf(value, newCapacity);
}[/code]StringBuffer的初始容量就很不错
比如下面的代码
1、[code=java]final int INIT_SIZE = 10;
StringBuffer buf = new StringBuffer(INIT_SIZE); [/code]2、[code=java]StringBuffer buf = new StringBuffer(); [/code]2这句话表示初始化了一个空的初始容量为16个字符的空间大小。
1表示创建了INIT_SIZE大小的空的字符空间。
StringBuffer内部是通过创建字符数组保存数据的,假如当前的容量小于实际存储的容量,它会以2倍容量的大小,重新构造新的字符数组,然后将以前的内容拷贝到新的字符数组中。 假如我们知道了需要存储数据的大小,直接指定开辟的空间,那样可以减少内部数组创建的次数。
[ 本帖最后由 詹季春 于 2011-07-27 09:51 编辑 ] |