String
String是字符串常量,final修饰,不可被继承,当创建之后就不能更改。
区别1:线程安全
StringBuffer自JDK1.0起就已经出现,StringBuilder自JDK1.5起开始出现。StringBuffer是线程安全的,StringBuilder是线程不安全的。因为StringBuffer的所有公开方法都是synchronized修饰的,而StringBuilder并没有synchronized修饰。
区别2:缓冲区
StringBuffer每次获取toString都会直接使用缓存区的toStringCache值来构造一个字符串。而StringBuilder则每次都需要复制一次字符数组,再构造一个字符串。所以,这也是对StringBuffer的一个优化吧,不过StringBuffer的这个toString方法仍然是同步的。
//StringBuffer
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
//StringBuilder
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
区别三:性能
既然StringBuffer是线程安全的,它的所有公开方法都是同步的,StringBuilder是没有对方法加锁同步的,所以StringBuilder的性能要大于StringBuffer。
总结:
StringBuffer适用于在多线程操作同一个StringBuffer的场景,如果是单线程场合StringBuilder更合适。