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。

字符串之StringBuffer 与 StringBuilder的对比的更多相关文章

  1. 章节二、4-String以及StringBuffer和StringBuilder的对比

    1.String---字符串常量 字符串是一个常量,一旦被初始化就不会被改变,它存储在字符串常量池中,每一个字符串对象在java中都是线程安全的.   2.StringBuffer---字符串变量 是 ...

  2. 【java基础】java字符串之StringBuffer和StringBuilder

    [一]简述区别 package com.sxf.test.string; public class StringBufferStringBuilderTest { public static void ...

  3. Java:字符串缓冲区StringBuffer和StringBuilder的使用

    StringBuffer特点: 1.是字符缓冲区,一个容器(不论缓冲区内容怎么变化,StringBuffer这个容器对象都不会改变) 2.是可变长度的 3.可以直接操作多个数据类型 4.最终会通过to ...

  4. Java中的常用类:包装类、String、StringBuffer、StringBuilder、Math、System、Arrays、BigInteger、BigDecimal、Data、Calendar

    一.包装类 √ 二.String类 ★ 三.StringBuffer和StringBuilder类 ★ 四.Math类 五.System类 六.Arrays类 七.BigInteger类和BigDec ...

  5. 【Java】String、StringBuffer、StringBuilder

    java.lang.String类 概述 String:代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现 String声明为final,不可被 ...

  6. String、StringBuffer、StringBuilder的区别

    在日常开发过程中String字符串估计是被用到最多的变量了,最近看了一些String.StringBuffer和StringBuilder的东西,三者都可以对字符串进行操作,他们究竟有什么区别,以及适 ...

  7. String 和StringBuffer、StringBuilder的区别?

    Java提供了:String.StringBuffer和StringBuilder,它们都是CharSequence的实现类,都可以作为字符串使用. String代表了字符序列不可变的字符串:而Str ...

  8. String vs StringBuffer vs StringBuilder

    String vs StringBuffer vs StringBuilder 本文翻译自:https://www.digitalocean.com/community/tutorials/strin ...

  9. Android中五大字符串总结(String、StringBuffer、StringBuilder、Spanna

    https://www.aliyun.com/jiaocheng/2861.html?spm=5176.100033.1.35.2ed56b03CbsYFK 摘要:String.StringBuffe ...

随机推荐

  1. LearnOpenGL学习笔记(六)——纹理单元

    #version 330 core out vec4 FragColor; in vec3 ourColor; in vec2 TexCoord; uniform sampler2D ourTextu ...

  2. Docker---Run命令

    docker运行在一个独立的隔离的进程中. 当用户执行dockerrun,它将启动一个有着独立的文件系统,独立的网络和独立的进程树的进程. 基本的docker run命令的格式: docker run ...

  3. python 浅析格式化输出和深浅copy

    一,格式化输出 今天主要想记录一下关于格式化输出的例子,然后结合了自己的理解,分析如下: 格式是 :百分号+占位符 主要有三种使用形式:%s  (其中s表示string)表示字符串 %d  (其中d表 ...

  4. C#微信公众号开发--网页授权(oauth2.0)获取用户基本信息一

    前言 微信网页授权共分为两种方式:snsapi_base.snsapi_userinfo. snsapi_base需要关注公众号,获取用户信息时不弹出用户授权界面. snsapi_userinfo是在 ...

  5. 【ichart】简单的统计图表ichart.js的使用

    1.首先下载,点击下载 2.只需要这一个js,粘贴赋值到自己项目中即可.   3.引入js <script type="text/javascript" src=" ...

  6. 【Spring】26、利用Spring的AbstractRoutingDataSource解决多数据源,读写分离问题

    多数据源问题很常见,例如读写分离数据库配置. 1.首先配置多个datasource <bean id="dataSource" class="org.apache. ...

  7. jQ效果:jQuery和css自定义video播放控件

    下面介绍一下通过jquery和css自定义video播放控件. Html5 Video是现在html5最流行的功能之一,得到了大多数最新版本的浏览器支持.包括IE9,也是如此.不同的浏览器提供了不同的 ...

  8. 【工具相关】Web--nodejs的安装

    一,从官网下载nodejs.org. https://nodejs.org/en/ 二,按照步骤一步一步安装就好.

  9. 【读书笔记】iOS-MVC

    用户的每一个动作都是以一个View的Action方式传递给Controller,然后,Controller再发送消息通知Model做出响应的逻辑处理,当Model层面上的业务逻辑处理有了结果之后,Mo ...

  10. 02--css背景与边框--css揭秘

    背景与边框 一 半透明边框 rgba/hsla颜色 1.难题 假设我们想给一个容器设置一层白色背景和一道半透明白色边框,body 的背景会从它的半透明边框透上来.我们最开始的尝试可能是这样的: #bo ...