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. 算法第四版中 while (!StdIn.isEmpty()) 循环无法跳出问题

    在IDEA中使用Ctrl+D就可以退出console输入

  2. lnmp环境一些基本命令行

    使用service启动/停止/重启相关服务 启动/停止/重启 php服务 service php-fpm start/stop/restart 启动/停止/重启 mysql service mysql ...

  3. Autograd:自动微分

    Autograd 1.深度学习的算法本质上是通过反向传播求导数,Pytorch的Autograd模块实现了此功能:在Tensor上的所有操作,Autograd都能为他们自动提供微分,避免手动计算导数的 ...

  4. 配置maven和maven本地仓库

    l配置maven: 下载maven 网站: http://maven.apache.org/download.cgi 下载解压,在配置maven 右键本地电脑   选择 属性  在选择高级环境变量在选 ...

  5. 3.SSM整合_多表_一对多的增删改查

    1.配置文件跟上一章一样,这里就不多写了,主要是Mapper映射文件,一对多反过来就是多对一 一 接口 public interface CategoryMapper { public void ad ...

  6. aarch64的架构:unrecognized command line option '-mfpu=neon'

    不用添加这个'-mfpu=neon'的编译器选项了,因为这个架构下neon是默认启动的. 参考: https://lists.linaro.org/pipermail/linaro-toolchain ...

  7. C语言复习6_doWhile循环

    基本语法 do{ 循环操作 }while(循环条件); 特点:先执行,再判断 先执行一遍循环操作 符合条件,循环继续执行 否则循环退出 例题: #include <stdio.h> #in ...

  8. Springboot关于脚本脚本启动的项目:

    #!/bin/bash if [ -f ~/.bash_profile ];then  . ~/.bash_profilefi JAVA_HOME=/usr/local/usr_software/jd ...

  9. webpack 4.0 中 clean-webpack-plugin 的使用

    其实 clean-webpack-plugin 很容易知道它的作用,就是来清除文件的. 一般这个插件是配合 webpack -p 这条命令来使用,就是说在为生产环境编译文件的时候,先把 build或d ...

  10. Java面试题:Hibernate的二级缓存与Hibernate多表查询

    我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...