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。
 
 

[十四]基础类型之StringBuffer 与 StringBuilder对比的更多相关文章

  1. C++学习基础十四——基础类型vector

    一.vector的使用 1. #include <vector> 2. 初始化的四种方法 vector<T> v1; vector<T> v2(v1); vecto ...

  2. Java基础-String、StringBuffer、StringBuilder

    看下面这段代码: public class Main { public static void main(String[] args) { String string = ""; ...

  3. [ Java学习基础 ] String、StringBuffer、StringBuilder比较学习

    首先讲获得字符串对象的方式有两种,一种是直接使用字符串常量,一种是使用new关键字创建,但它们之间是有一些区别,如下运行实例: String s1 = new String("Hello&q ...

  4. java学习(四)--- String 、StringBuffer、StringBuilder 和 数组

    对于 String.StringBuffer.StringBuilder比较一下 主要说说三者的不同 String 长度大小不可变 StringBuffer 和 StringBuilder 长度可变 ...

  5. 学JAVA第二十四天,Set集合与StringBuilder

    下面的内容需要慢慢看,因为,我的语言表达能力不是很好 首先说Set把,Set集合是一个无序且不允许重复的集合,而且查找效率也是快的可怕的. 但是,有些时候,我们必须要用储存多个相同的值时,Set也是可 ...

  6. java编程思想第四版第十四章 类型信息习题

    fda dfa 第三题u package net.mindview.typeinfo.test4; import java.util.ArrayList; import java.util.Array ...

  7. String、StringBuffer、StringBuilder对比

    1.String 用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改.这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. Str ...

  8. 十四、Java基础---------String、StringBuffer、StringBuilder基本应用

    在前面的博客中曾提及Java的数据类型分为基本数据类型,和引用数据类型,而String便是最常见的应用数据类型,本文将着重介绍这一引用数据类型的用法. String 字符串     String类是对 ...

  9. Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类

    一.String类 1.创建字符串对象 创建字符串对象有两种方法:直接用“=”或者使用“new String(...)” String aStr = "TMZ"; String b ...

随机推荐

  1. Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比

    1.概论 -- 来自维基的解释 /dev/null  : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一 ...

  2. MyBatis(五)select返回list数据

    (1)接口中编写方法 public List<Emp> getEmps(String lastName); (2)编写Mapper文件 <select id="getEmp ...

  3. jquery for循环

    第一种: for(var i=0,len=$len.length; i<len; i++){//alert($len.eq(i).html());$zongshu=$zongshu+$len.e ...

  4. HBase rebalance 负载均衡源码角度解读使用姿势

    关键词:hbase rebalance 负载均衡 参考源码版本:apache-hbase-1.1.2 什么是HBase Rebalance ? 随着数据写入越来越多以及不均衡,即使一开始每个Regio ...

  5. docker kubernetes Swarm容器编排k8s CICD部署

    1docker版本 docker 17.09 https://docs.docker.com/ appledeAir:~ apple$ docker version Client: Docker En ...

  6. Vue v-for循环添加表单v-model不重复变动的注意事项!

    正常添加,v-model,修改所有循环会得到一样的结果! 定义一个users[]的数组,不要定义全局的user,而是要在Vue里面的方法里定义局部的变量添加.

  7. vue-router下的html5 history在iis服务器上的设置 vue去掉#

    转自:https://www.cnblogs.com/zzsdream/p/6576639.html 1.安装 url rewrite模块到IIS 下载地址 2.在web.config文件中 syst ...

  8. js-day02-BOM和DOM

    BOM和Document对象常见属性和方法: BOM是browser object model的缩写,简称浏览器对象模型. Document 对象每个载入浏览器的 HTML 文档都会成为 Docume ...

  9. 构建一个 预装 pm2 的 node 项目 docker 底包

    Dockerfile: 创建 dockerfile 文件, 命名为 dockerfile-yourProject-node.8.12.0-pm2 # MAGE: yourGroup/yourProje ...

  10. 依赖注入[7]: .NET Core DI框架[服务注册]

    包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IServiceProvider对象.服务注册就是创建出现相应的ServiceDescriptor对象并将其添加到 ...