- 1、String
- 2、StringBuilder、StringBuffer
- 共同点:
- 区别:
- 1、运行速度
- 2、线程安全性
String是字符常量,一旦确定就不可变,原因是String 类中使⽤ final 关键字修饰字符数组来保存字符串,
private final char value[] ;2、StringBuilder、StringBuffer
StringBuilder和StringBuffer均为字符串变量,都继承⾃ AbstractStringBuilder 类,具有可变性,原因在 AbstractStringBuilder 中也是使⽤字符数组保存字符串 char[]value 但是没有⽤ final 关键字修饰,所以这两种对象都是可变的。
共同点:三者都是字符串类。StringBuilder和StringBuffer都是继承AbstractStringBuilder类,存储字符串都是使用数组进行存储的。
区别: 1、运行速度StringBuilder > StringBuffer > String
原因:String是字符常量,当 String 类型改变时,都会⽣成⼀个新的 String 对象,然后将指针指向新的 String 对象。而StringBuilder和StringBuffer均为字符串变量,StringBuffer 每次都会对 StringBuffer 对象本身进⾏操作,⽽不是⽣成新的对象并改变对象 引⽤。
2、线程安全性String、StringBuffer是线程安全的,两者的区别在于,String 中的对象是不可变的,StringBuffer 对⽅法加了sychronized修饰,所以是线程安全的,StringBuilder 并没有对⽅法进⾏加同步锁,所以是⾮线程安全的。
StringBuffer部分源码
//StringBuffer源码
@Override
public synchronized void trimToSize() {
super.trimToSize();
}
@Override
public synchronized void setLength(int newLength) {
toStringCache = null;
super.setLength(newLength);
}
StringBuilder部分源码
// StringBuilder部分源码
public StringBuilder append(StringBuffer sb) {
super.append(sb);
return this;
}
@Override
public StringBuilder append(CharSequence s) {
super.append(s);
return this;
}
应用场景:
- 操作少量的数据: 适⽤ String
- 单线程操作字符串缓冲区下操作⼤量数据: 适⽤ StringBuilder
- 多线程操作字符串缓冲区下操作⼤量数据: 适⽤ StringBuffer
参考视频:https://www.bilibili.com/video/BV1cr4y1m7id?p=11



