String(大姐,出生于JDK1.0时代) 不可变字符序列
StringBuffer(二姐,出生于JDK1.0时代) 线程安全的可变字符序列
StringBuilder(小妹,出生于JDK1.5时代) 非线程安全的可变字符序列
1.可变与不可变
String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。 private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。 char[] value;
2.是否多线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
StringBuffer和StringBuilder的类结构
StringBuffer 和 StringBuilder 继承了一个抽象的字符串父类: AbstractstringBuilder
StringBuffer 和 StringBuilder的区别
区别1:线程安全
StringBuffer:线程安全,StringBuilder: 线程不安全。因为StringBuffer的所有公开方法都是synchronized修饰的,而StringBuilder 并没有StringBuilder 修饰。
区别2:缓冲区
可以看出,StringBuffer 每次获取toString都会直接使用缓存区的toStringCache 值来构造一个字符串。
而StringBuilder则每次都需要复制-次字符数组,再构造一 个字符串。
所以,缓存冲这也是对StringBuffer的一个优化吧,不过StringBuffer的这个toString方法仍然是同步的。
区别3:性能
既然StringBuffer是线程安全的,它的所有公开方法都是同步的,StringBuilder 没有对方法加锁同步的,所以无疑问,StringBuilder 的性能要远大于StringBuffer。
StringBuffer 适用于用在多线程操作同一个StringBuffer的场景
如果是单线程场合 StringBuilder更适合。