zoukankan      html  css  js  c++  java
  • 字符串之StringBuffer 与 StringBuilder的对比

    StringBuilder 和 StringBuffer是高度类似的两个类
    StringBuilder是StringBuffer的版本改写,下面从几个方面简单的对比下他们的区别

    类继承关系

    上文中,我们简单介绍了AbstractStringBuilder
    他是可变的字符序列的抽象模型,定义了可变字符序列的公共行为
    它是一个抽象类,针对一些操作提供了默认的实现
    StringBuilder 和 StringBuffer 都是可变字符序列
    所以他们都实现了AbstractStringBuilder
    image_5bd264bb_7d96
     

    方法体系

     
    他们除了实现了AbstractStringBuilder  和 CharSequence外
    实际上他们没有自己的方法
    所有的方法都来自AbstractStringBuilder  和 CharSequence
     
    image_5bd264bc_328c
    从上图看得出来,构造方法的方法签名----方法参数的个数和类型都是一样的
    其实, 他们就是一样的,初始容量等
    image_5bd264bc_22ea
     

    线程安全

     
    StringBuffer是线程安全的
    StringBuilder是非线程安全的
     
    其实线程安全也就是方法前面增加了一个synchronized关键字
    比如下面的几个方法

    toStringCache

    StringBuffer中有一个toStringCache 就像它的名字一样,toString()方法的cache
    简言之就是缓存toString方法
    每次调用toString会检查这个字段,如果不为null将会使用它进行对象创建
    如果为null  将会给他初始化赋值,也就是缓存
    当调用其他的任何方法改变StringBuffer时,就会把toStringCache进行清空
    比如下面截图方法setCharAt append
    如果每次都是更改变动后调用,显然,还适得其反的浪费了性能
    如果多次调用toString将会得到好处
    image_5bd264bc_4681

    总结

    两个类的功能逻辑上来说基本一样,都是可变的字符序列
    代码的相似度也很高
    他们本身就是为了做同一件事情
    只不过是各自的侧重点不同
    他们都实现了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。
  • 相关阅读:
    Sql题目精选练习
    SqlServer2008数据库的备份与还原
    SqlServer视图介绍以及创建方式
    Java反射详解
    for(foo('a') ; foo('b') && (i<2);foo('c'))的执行结果
    jdk与jre与jdk都是干什么的有什么区别和jvm详解:
    List去重为什么要写equals(),hashCode()方法
    String类的常用方法以及知识点总结
    o enclosing instance of type ArrayList_day02 is accessible. Must qualify the allocation with an enclosing instance of type ArrayList_day02
    JAVA整理01--面向对象基础
  • 原文地址:https://www.cnblogs.com/zhaosq/p/9855199.html
Copyright © 2011-2022 走看看