[源码分析]StringBuffer

[源码分析]StringBuffer

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同样的, 都有这段代码.

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数组....

相关文章
相关标签/搜索