StringBuffer和StringBuilder比较

    这个问题其实是很多面试官喜欢问的问题,大多数童鞋都知道它们的主要区别是StringBuffer是线程安全的,StringBuilder非线程安全,因为如此,StringBuilder性能略比StringBuffer好。

    我主要从它俩的源码出发来分析它们的区别。

相同点

1.它俩都继承自抽象类AbstractStringBulder,实现了Appendable, CharSequece,Serializable接口,而且都是final类型,跟String类一样不能再有子类扩展了
2.它们的内部数据结构都是字符数组:

1
2
3
4
/**
* The value is used for character storage.
*/
char[] value;

3.它们默认的创建时的长度为16个字符
4.append/delete/insert/replace方法的核心操作都是通过System.arraycopy实现
5.它们都提供四个构造函数

1
2
3
4
public StringBxxx();
public StringBxxx(int capacity);
public StringBxxx(String str);
public StringBxxx(CharSequece seq);

6.每当append方法执行前,都会判断数组大小是否足够,如果不够则扩展其长度,算法为 当前容量长度*2+2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* This method has the same contract as ensureCapacity, but is
* never synchronized.
*/
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0)
expandCapacity(minimumCapacity);
}
/**
* This implements the expansion semantics of ensureCapacity with no
* size check or synchronization.
*/
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);
}
不同点

1.StringBuffer中方法都是synchronized的,保证线程安全
2.StringBuffer多一个toStringCache对象,当StringBuffer有toString方法执行时,就会缓存在这里,当内部数据发生变化就会清除缓存内容
3.StringBuilder从JDK1.5才开始有,而StringBuffer从JDK1.0就开始有了

分享到 评论