一、分析
1、 部分源码展示
①StringBuffer类的部分源码:
//获得当前StringBuffer对象储存字符长度(真实的)
@Override
public synchronized int length() {
return count;
}
//获得当前StringBuffer对象的容量大小
@Override
public synchronized int capacity() {
return value.length;
}
②StringBuilder类的部分源码:
//在StringBuilder对象后面追加float类型的数据
@Override
public StringBuilder append(float f) {
super.append(f);
return this;
}
//在StringBuilder对象后面追加double类型的数据
@Override
public StringBuilder append(double d) {
super.append(d);
return this;
}
②共同点和不同点:
(1)共同点:
1)底层都是使用了char[ ]数组进行存储。
(2)不同点:
1)StringBuffer类底层的char[ ]数组使用了transient关键字进行修饰,不能被序列化到硬盘中去。StringBuilder类底层的char[ ]数组(在父类AbstractStringBuilder中)会被序列化到硬盘中。
2)StringBuffer类的每个方法都被synchronized修饰,所以是线程安全的,但是StringBuilder却没有,是线程不安全的。
二、总结
1、总结:
(1)StringBuffer的每个方法上都用synchronized修饰,所以说StringBuffer是线程安全的。
(2)StringBuilder的每个方法都没有任何的线程同步/锁的同步,所以说StringBuilder是线程不安全的。
(3)但是线程同步的容器代表了它的速度会比线程不同步的容器操作慢一些,也就是牺牲性能成就安全。
2、建议:
(1)在单线程的环境下,就不需要使用线程安全的容器,这样会提高程序的运行效率;在多线程的环境下,就需要使用线程安全的容器,这样会使线程操作更加安全。