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 修饰。
StringBuffer代码片段
区别2:缓冲区
StringBuffer代码片段
StringBuilder
代码片段