[十四]基础类型之StringBuffer 与 StringBuilder对比

StringBuilder 和 StringBuffer是高度相似的两个类
StringBuilder是StringBuffer的版本改写,下面从几个方面简单的对比下他们的区别

类继承关系

上文中,咱们简单介绍了AbstractStringBuilder
他是可变的字符序列的抽象模型,定义了可变字符序列的公共行为
它是一个抽象类,针对一些操做提供了默认的实现
StringBuilder 和 StringBuffer 都是可变字符序列
因此他们都实现了AbstractStringBuilder
image_5bd264bb_7d96
 

方法体系

 
他们除了实现了AbstractStringBuilder  和 CharSequence外
实际上他们没有本身的方法
全部的方法都来自AbstractStringBuilder  和 CharSequence
 
image_5bd264bc_328c
从上图看得出来,构造方法的方法签名----方法参数的个数和类型都是同样的
其实, 他们就是同样的,初始容量等
image_5bd264bc_22ea
 

线程安全

 
StringBuffer是线程安全的
StringBuilder是非线程安全的
 
其实线程安全也就是方法前面增长了一个synchronized关键字
好比下面的几个方法

 

toStringCache

StringBuffer中有一个toStringCache 就像它的名字同样,toString()方法的cache
简言之就是缓存toString方法
每次调用toString会检查这个字段,若是不为null将会使用它进行对象建立
若是为null  将会给他初始化赋值,也就是缓存
当调用其余的任何方法改变StringBuffer时,就会把toStringCache进行清空
好比下面截图方法setCharAt append
若是每次都是更改变更后调用,显然,还拔苗助长的浪费了性能
若是屡次调用toString将会获得好处
image_5bd264bc_4681

总结

两个类的功能逻辑上来讲基本同样,都是可变的字符序列
代码的类似度也很高
他们自己就是为了作同一件事情
只不过是各自的侧重点不一样
他们都实现了AbstractStringBuilder和CharSequence
他们的方法都来自于这两个类
只不过StringBuffer是线程安全的,StringBuilder非线程安全
其实 早在1.0版本StringBuffer 就已经存在了
StringBuffer则是在1.5才加入进来的,AbstractStringBuilder 也是在1.5加入进来
StringBuilder  就是 StringBuffer的一个非线程安全的实现
AbstractStringBuilder 也是后来才对类的设计进行抽象升华的
StringBuffer才实现了这个类
 
他们的源代码也大多数是雷同的
主要差别就在于如下三点
StringBuffer覆盖的方法略微多一点
StringBuffer 在方法上增长了synchronized关键字用于同步,亦或者应该说,StringBuilder去掉了synchronized
StringBuffer的toStringCache缓存
若是去掉这三点,这两份代码就几乎是同样的了
 
除非你的确很是确信你须要使用StringBuffer
不然,若是不可变使用String 
若是可变使用StringBuilder ,尽量的放弃StringBuffer 吧
 
总结起来就一句话
StringBuilder是StringBuffer的非同步版本就是版本改写
能用StringBuilder就不要用StringBuffer。
相关文章
相关标签/搜索