StringBuilder 和 StringBuffer

Jun 22, 2016


前几天用到了StringBuilder,顺便看了一下代码,记一下一些比较有意思的。

StringBuilder是非线程安全的,它和StringBuffer的代码绝大部分公用抽象类AbstractStringBuilder中的方法。

它的初始化大小是16,如果在构造函数中传入字符串,大小就会是str.length() + 16

当它append(null)时,是真的会 append 「null」进数组的,类似的,append 一个boolean数值时,结果也是「true」或者「false」。

空间增长策略,每次扩充 size*2 + 2,不知道这个 + 2 是什么情况。

然后大部分的类似insertreplace的方法都调用了System.arraycopy来复制。

这里的reverse()会判断是不是Unicode字符,如果是的话在翻转一遍过后还会用某种方法再翻一下。

StringBuffer是线程安全的,其实就是在方法前都加了synchronized

比较奇怪的是StringBuffer缓存了一个toString()对象,然后每次更新对象置null,不知道为什么StringBuilder不缓存一下。