您的位置:首页 > Web前端

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

2018-10-26 08:57 447 查看
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。    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: