字符串之StringBuffer 与 StringBuilder的对比
程序员文章站
2022-06-30 13:24:45
StringBuilder 和 StringBuffer是高度类似的两个类 StringBuilder是StringBuffer的版本改写,下面从几个方面简单的对比下他们的区别 原文地址:[十四]基础类型之StringBuffer 与 StringBuilder对比 类继承关系 上文中,我们简单介绍 ......
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 就已经存在了
stringbuilder 则是在1.5才加入进来的,abstractstringbuilder 也是在1.5加入进来
stringbuilder 就是 stringbuffer的一个非线程安全的实现
abstractstringbuilder 也是后来才对类的设计进行抽象升华的
stringbuffer才实现了这个类
他们的源代码也大多数是雷同的
主要差异就在于以下三点
stringbuffer覆盖的方法略微多一点
stringbuffer 在方法上增加了synchronized关键字用于同步,亦或者应该说,stringbuilder去掉了synchronized
stringbuffer的tostringcache缓存
如果去掉这三点,这两份代码就几乎是一样的了
除非你的确非常确信你需要使用stringbuffer
否则,如果不可变使用string
如果可变使用stringbuilder ,尽可能的放弃stringbuffer 吧
总结起来就一句话
stringbuilder是stringbuffer的非同步版本,就是版本的改写
能用stringbuilder就不要用stringbuffer。
上一篇: 年轻人被公司开除了
推荐阅读
-
Python - 基本数据类型及其常用的方法之数字与字符串
-
Python15之字符串的格式语句与操作符
-
ES6学习笔记之map、set与数组、对象的对比
-
Java之String、StringBuffer、StringBuilder的区别分析
-
Javascript新手入门之字符串拼接与变量的应用
-
字符串之StringBuffer 与 StringBuilder的对比
-
百度理财产品之百赚与百赚利滚利有什么区别?百赚和百赚利滚利版的区别对比
-
详解.NET中string与StringBuilder在字符串拼接功能上的比较
-
String,StringBuffer与StringBuilder的区别
-
Unity/C#基础复习(3) 之 String与StringBuilder的关系