StringBuffer是线程安全的
面试被问到StringBuilder和StringBuffer的区别,心想终于问到个会的问题了(-,-原谅我太水。。。),信誓旦旦的说一个是线程安全的,一个不是线程安全的,面试大哥说既然StringBuffer是线程安全的,还没说完,我打断他说,StringBuilder是线程安全的。。。。(唉。。。嘴贱。。。),我竟然错了这么久。。。
由于StringBuffer是线程安全的,所以在性能上会有所下降。
联系
两者都是继承自AbstractStringBuilder
这个抽象类,AbstractStringBuilder
类实现了append
、delete
、charAt
、insert
等方法。
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
/**
* The count is the number of characters used.
*/
int count;
上面是这个类的声明和最主要的两个变量,一个用来存储字符,一个用来表示实际的长度。
在value
数组长度不足时,会调用expandCapacity
方法扩展长度,新的长度计算方法为:
int newCapacity = value.length * 2 + 2;
然后通过System.arrayCopy
方法将数组复制过去。
可以看到这里的容量是以两倍递增的,而默认初始化容量只有16,所以如果可以实现确定字符串的规模,应该尽量指定StringBuilder
或StringBuffer
的容量,一方面可以避免扩容,另一方面也可以减少空间浪费
StringBuilder
基本与AbstractStringBuilder
相同,而StringBuffer
重写了大部分方法为synchronized
方法。
例如
public synchronized char charAt(int index) {
if ((index < 0) || (index >= count))
throw new StringIndexOutOfBoundsException(index);
return value[index];
}
和
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}