概述
字符串作为最常用的类型之一,java除了提供不可变的String类之外,还拥有可变字符串StringBuilder与StringBuffer。两者最大的区别在于StringBuilder不保证线程安全,而StringBuffer则将方法以synchronized修饰。所以可以保证线程安全。
除此之外,两者都继承了AbstractStringBuilder类,所拥有的方法近乎完全相同。作为抽象类,AbstractStringBuilder实现了Appendable与CharSequence接口。
值得注意的是,与StringBuilder相比,StringBuffer中的toString方法,利用了char[] toStringCache缓存来提高性能。
1 | /** |
为什么StringBuilder不采用toStringCache呢?参考stackoverflow,大意是StringBuiler不提供线程同步,而在保持线程不同步的性能优势下,提供缓存极难实现。并且,这种缓存优化现实中使用很少。
由于StringBuilder与StringBuffer的差别很小,所以两者很多方法的具体实现,都放在了共同的父类AbstractStringBuilder中。本文姑且从AbstractStringBuilder入手,对字符串操作略作分析。
导航
append
AbstractStringBuilder中重载了大量的append方法,这里暂且只以常用的append(String)举例。
1 | // 字符存放,一个字符2-byte |
ensureCapacity(int minimumCapacity)
Array在添加元素的时候,免不了容量的限制。所以以byte[]来保存value,也需要对容量进行额外的保证。
1 | private void ensureCapacityInternal(int minimumCapacity) { // 最少字符(2-byte)数 |
reverse()
直接上代码:
1 | public AbstractStringBuilder reverse() { |