[源码分析]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数组....