对字符串的修改

String:不可变字符串

StringBuffer:可变字符串、效率低(速度慢)、但线程安全

StringBuilder:可变字符序列、效率高(速度快)、线程不安全(不能同步访问)

继承结构

源码分析

StringBuffer 的所有公开方法都是由synchronized修饰的,但是StringBuilder没有。(synchronized是Java中的关键字,是一种同步锁)

StringBuffer:

1
2
3
4
5
6
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}

对于缓冲区:

StringBuffer:

1
2
3
4
5
6
7
8
9
private transient char[] toStringCache;

@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}

StringBuilder:

1
2
3
4
5
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}

前者每次调用toString方法时都会直接使用缓冲区的toStringCache创建字符串,后者每次都复制一个字符串,并再创建一个字符串

性能上毫无疑问是StringBuilder更加效率高,StringBuilder或许更加适合在单线程操作字符串缓冲区下操作大量的数据。