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

StringBuilder 和 StringBuffer是高度类似的两个类 StringBuilder是StringBuffer的版本改写,下面从几个方面简单的对比下他们的区别 原文地址:[十四]基础类型之StringBuffer 与 StringBuilder对比 类继承关系 上文中,我们简单介绍了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。https://www.cnblogs.com/noteless/p/9854362.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信