Just Do It
三者相同点
String、StringBuffer、StringBuilder都是java中关于字符串处理的类。
三者都是被final修饰,不可被继承
底层实现都是 char value[]
**
String类型字符串的每次操作都会产生新的对象
//对字符串的追加、删除某个字符,其实都是对字符数组操作 private final char value[];
String类的char类型的数组value被final修饰
final(最终的)修饰变量:表示变量一旦被赋值就不可用更改它的值
因此,每次对String类型字符串的操作都会产生新的对象!(final char value[],一旦往数组value里增加字符,那么将是一个新的String对象)
StringBuffer和StringBuilder都是在原对象上操作
底层实现
//StringBuffer和StringBuilder都继承AbstractStringBuilder类
//
char[] value;
//StringBuilder和StringBuffer默认容量是16
public StringBuilder() {
super(16);
}
public StringBuffer() {
super(16);
}
value数组没有被final修饰,因此是可变的,故对字符串的修改都是在原对象上进行。
StringBuffer、StringBuilder的区别相同点
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
- StringBuffer和StringBuilder都继承AbstractStringBuilder类,故基本操作都差不多。
- 对字符串的修改都是在原对象上进行。
不同点:
StringBuffer是线程安全的,StringBuilder线程不安全
//StringBuffer的方法都被synchronized修饰
public synchronized StringBuffer append(char[] str) {
toStringCache = null;
super.append(str);
return this;
}
....
public StringBuilder append(char[] str) {
super.append(str);
return this;
}
我截取了StringBuffer和StringBuilder类的部分方法,可以从源码看出StringBuffer的方法都都加上了synchronized锁,因此StringBuffer是线程安全的。
三者性能比较:StringBuilder > StringBuffer > String
应用场景需要频繁改变字符串内容时,使用StringBuilder和StringBuffer。
优先使用StringBuilder,它的性能更好一些。
如果涉及到多线程使用共享变量,则使用StringBuffer。



