zoukankan      html  css  js  c++  java
  • [源码分析]StringBuffer

    [源码分析]StringBuffer

    StringBuffer是继承自AbstractStringBuilder的.

    这里附上另外两篇文章的连接:

    AbstractStringBuilder : http://www.cnblogs.com/noKing/p/9427967.html 

    StringBuilder : http://www.cnblogs.com/noKing/p/jdk8_StringBuilder.html

    构造器

    我每篇文章都说. 请忽略我的"My". 我copy了jdk的代码, 然后把StringBuffer改为了MyStringBuffer. 核心源码不会改动的.

    构造器和StringBuilder里的一样. 不过还是再贴出来吧.

    无参构造器是默认的大小为16.

    或者可以直接给定大小. 来规定初始化时的数组大小.

    如果是根据传入字符串来构造的, 那么初始大小就是: 传入的字符串长度+16.

    其他常用方法

    以reverse为例吧.

    1. 常用的方法基本都是调用的父类的

    2. 方法声明上多了synchronized修饰符

    3. 多了一行toStringCache = null. (这个下面待会儿再讲)

    4. return this是和StringBuilder一样的, 都有这段代码.

    toString方法

    我们打开StringBuffer源码, 第一眼就可以看到这个字段

    英文注释也说得很清楚. 这个toStringCache字段是为了作缓存的.

    缓存什么呢? 缓存最后一次toString的内容. 当被修改的时候这个cache清空. 

    也就是说, 如果没被修改, 那么这个toStringCache就是上一次toString的结果.

    没被修改的时候, 就可以直接把toStringCache作为new String的参数. 然后把这个String返回就行了. 

    也就是cache有效的时候, 就不必进行arraycopy的复制操作. cache失效了才进行arraycopy的复制操作.

    Stack Overflow 里也有这个问题 Why StringBuffer has a toStringCache while StringBuilder not?

    toString方法代码如下:

    里面的String构造器的源码如下:

    总结

    1. 构造的大小和16相关. 要么是16, 要么就是加16.(除非使用了定制数组大小的那个构造器, 也就是 本文中截图的第二个构造器. 那么就是指定多大, 初始数组就是多大了.)

    2. 实现了toString方法. 内部实现就是每次toString都是new一个String对象.

    3. 其他方法都是调用的父类的方法. 只是多加了一行return this;

    4. 方法上加了synchronized修饰符来保证线程安全.

    5. 有一个我觉得没什么作用的toStringCache数组....

  • 相关阅读:
    沉默
    抱冰握火
    数据库原理-SQL查询语句
    简单算法的实现——集合
    团队总结
    个人作业----项目测试
    团队项目-Beta冲刺
    团队项目-Alpha版本发布1
    团队项目-----系统设计 认真不马虎队
    团队项目----需求分析 认真不马虎队
  • 原文地址:https://www.cnblogs.com/noKing/p/9431618.html
Copyright © 2011-2022 走看看