[源码分析]StringBuffer

[源码分析]StringBuffer

StringBuffer是继承自AbstractStringBuilder的.

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

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

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

[源码分析]StringBuffer

构造器

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

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

[源码分析]StringBuffer

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

[源码分析]StringBuffer

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

[源码分析]StringBuffer

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

其他常用方法

以reverse为例吧.

[源码分析]StringBuffer

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

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

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

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

toString方法

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

[源码分析]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方法代码如下:

[源码分析]StringBuffer

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

[源码分析]StringBuffer

总结

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

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

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

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

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

上一篇:.net core webapi项目实战之三:webapi的路由及与传统mvc的不同点


下一篇:JSTL 入门