String,StringBuffer 和 StringBuilder 的区别

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 代码片段


可以看出,StringBuffer 每次获取toString都会直接使用缓存区的toStringCache 值来构造一个字符串。

而StringBuilder则每次都需要复制-次字符数组,再构造一 个字符串。

所以,缓存冲这也是对StringBuffer的一个优化吧,不过StringBuffer的这个toString方法仍然是同步的。

区别3:性能

既然StringBuffer是线程安全的,它的所有公开方法都是同步的,StringBuilder 没有对方法加锁同步的,所以无疑问,StringBuilder 的性能要远大于StringBuffer。


StringBuffer 适用于用在多线程操作同一个StringBuffer的场景

如果是单线程场合 StringBuilder更适合。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容