StringBuffer是继承自AbstractStringBuilder的.html
这里附上另外两篇文章的链接:数组
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里的同样. 不过仍是再贴出来吧.ui
无参构造器是默认的大小为16.this
或者能够直接给定大小. 来规定初始化时的数组大小.spa
若是是根据传入字符串来构造的, 那么初始大小就是: 传入的字符串长度+16.线程
以reverse为例吧.htm
1. 经常使用的方法基本都是调用的父类的
2. 方法声明上多了synchronized修饰符
3. 多了一行toStringCache = null. (这个下面待会儿再讲)
4. return this是和StringBuilder同样的, 都有这段代码.
咱们打开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数组....