[十四]基础类型之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 就已经存在了

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。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python爱好者

Python高效编程(五)

11730
来自专栏技术之路

【转】Go Interface 源码剖析

源网址:http://legendtkl.com/2017/07/01/golang-interface-implement/

19820
来自专栏Java技术分享圈

杨老师课堂之Excel VBA 程序开发第六讲根据部门列创建工作表

方式1:本节课件下载地址:链接: https://pan.baidu.com/s/1rf5pRmZ95fjVbz70KYi6Aw 密码: q9yk

10040
来自专栏码匠的流水账

聊聊GenericObjectPool的泄露检测

本文主要聊聊GenericObjectPool的abandon参数。主要用来做连接池的泄露检测用。

18920
来自专栏专注 Java 基础分享

深入理解循环队列----循环数组实现ArrayDeque

     我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势。此处我们将要介绍的循环队列其实...

34980
来自专栏软件开发 -- 分享 互助 成长

为什么无返回值的链表的插入操作头结点一定要用指向指针的指针

前言: 为什么链表的插入操作头结点一定要用指向指针的指针?之前自己对这个问题总是一知半解,今天终于花了点时间彻底搞懂了。 总的来说这样做的目的是为了应对“空链表...

25370
来自专栏阿杜的世界

Java虚拟机规范阅读笔记—第2章

在发生一个方法调用的时候会创建一个栈帧,在方法执行结束(无论是正常结束还是抛出异常)的时候栈帧会被销毁。栈帧在JVM的栈上分配,栈属于某个线程。每个栈帧都有自己...

10420
来自专栏函数式编程语言及工具

Scalaz(19)- Monad: \/ - Monad 版本的 Either

  scala标准库提供了一个Either类型,它可以说是Option的升级版。与Option相同,Either也有两种状态:Left和Right,分别对应Op...

29750
来自专栏维C果糖

Guava 指南 之「前置条件」

前置条件 Guava 提供了很多用于进行前置条件检查的工具,我们强烈建议静态导入这些方法。 每个方法都用三种形式: 没有额外的参数。抛出的任何异常都没有错误信息...

21970
来自专栏coder修行路

面向对象编程进阶

1、   静态方法staticmethod 只是名义上归类管理,实际上再静态方法里访问不了类和实例中的任何属性 定义: 通过@staticmethod装饰器即可...

23390

扫码关注云+社区

领取腾讯云代金券