StringBuffer和StringBuilder都是可变的字符串,都继承了一个抽象的字符串父类:AbstractStringBuilder。
线程安全
StringBuffer:线程安全,StringBuilder:线程不安全。因为StringBuffer的所有公开方法都有synchronized修饰,而 StringBuilder 并没有 synchronized 修饰。
缓冲区
StringBuffer代码toString方法:1
2
3
4
5
6
7
8
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
StringBuilder代码toString方法:
1 |
|
StringBuffer每次获取toString都会直接使用缓存区的toStringCache值来构造一个字符串。而StringBuilder则每次都需要复制一次字符数组,再构造一个字符串。
性能
StringBuffer是线程安全的,它的所有公开方法都是同步的,StringBuilder 是没有对方法加锁同步的,所以毫无疑问,StringBuilder的性能要远大于StringBuffer。所以,StringBuffer适用于用在多线程操作同一个StringBuffer的场景,如果是单线程场合StringBuilder更适合。