StringBuilder 和 StringBuffer
前几天用到了StringBuilder
,顺便看了一下代码,记一下一些比较有意思的。
StringBuilder
是非线程安全的,它和StringBuffer
的代码绝大部分公用抽象类AbstractStringBuilder
中的方法。
它的初始化大小是16
,如果在构造函数中传入字符串,大小就会是str.length() + 16
。
当它append(null)
时,是真的会 append 「null」进数组的,类似的,append 一个boolean
数值时,结果也是「true」或者「false」。
空间增长策略,每次扩充 size*2 + 2
,不知道这个 + 2 是什么情况。
然后大部分的类似insert
,replace
的方法都调用了System.arraycopy
来复制。
这里的reverse()
会判断是不是Unicode
字符,如果是的话在翻转一遍过后还会用某种方法再翻一下。
StringBuffer
是线程安全的,其实就是在方法前都加了synchronized
。
比较奇怪的是StringBuffer
缓存了一个toString()
对象,然后每次更新对象置null
,不知道为什么StringBuilder
不缓存一下。
- 上一篇 Java 中字符编码占用空间问题
- 下一篇 Java Memory Model 笔记