StringBuilder 和 StringBuffer是高度类似的两个类
StringBuilder是StringBuffer的版本改写,下面从几个方面简单的对比下他们的区别
类继承关系
上文中,我们简单介绍了AbstractStringBuilder
他是可变的字符序列的抽象模型,定义了可变字符序列的公共行为
它是一个抽象类,针对一些操作提供了默认的实现
StringBuilder 和 StringBuffer 都是可变字符序列
所以他们都实现了AbstractStringBuilder
方法体系
他们除了实现了AbstractStringBuilder 和 CharSequence外
实际上他们没有自己的方法
所有的方法都来自AbstractStringBuilder 和 CharSequence
从上图看得出来,构造方法的方法签名—-方法参数的个数和类型都是一样的
其实, 他们就是一样的,初始容量等
线程安全
StringBuffer是线程安全的
StringBuilder是非线程安全的
其实线程安全也就是方法前面增加了一个synchronized关键字
比如下面的几个方法
toStringCache
StringBuffer中有一个toStringCache 就像它的名字一样,toString()方法的cache
简言之就是缓存toString方法的
每次调用toString会检查这个字段,如果不为null将会使用它进行对象创建
如果为null 将会给他初始化赋值,也就是缓存
当调用其他的任何方法改变StringBuffer时,就会把toStringCache进行清空
比如下面截图方法setCharAt append
如果每次都是更改变动后调用,显然,还适得其反的浪费了性能
如果多次调用toString将会得到好处
总结
两个类的功能逻辑上来说基本一样,都是可变的字符序列
代码的相似度也很高
他们本身就是为了做同一件事情
只不过是各自的侧重点不同
他们都实现了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。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/15622.html