1、可变性
String对数据的保存是通过字符数组存储,但是该数组使用了“final”进行修饰,所以是不可变的;String中定义:private final charvalue[];
StringBuilder和StringBuffer都是集成于AbstractStringBuilder,AbstractStringBuilder中对数据的保存也是通过字符数组进行保存的,但是没有进行"final"修饰,所以是可变的;AbstractStringBuilder中定义:char[]value;
2、安全性
String的数组是不可变得,可以理解成常量,所以是线程安全的;
AbstractStringBuilder中的数组是可变的,但是StringBuffer中方法使用了同步锁,因此也是线程安全的。而StringBuilder则是线程不安全的;
StringBuffer中方法如下:
@Override
public synchronizedStringBufferappend(Object obj) {
toStringCache=null;
super.append(String.valueOf(obj));
return this;
}
3、StringBuilder与StringBuffer的共同点
两者有共同的父类,所以他们有共同的父类方法,只是StringBuffer针对父类方法添加了同步锁;
单线程使用StringBuilder效率要高于StringBuffer;
网友评论