StringBuilder类源码剖析
一、StringBuilder类的简介
StringBuilder
是可变字符序列。此类提供与StringBuffer
兼容的API,但不保证同步。此类设计用于在单个线程使用字符串缓冲区的场景下用作StringBuffer的直接替代(通常情况如此)。==在可能的情况下,建议优先使用此类而不是StringBuffer,因为它在大多数实现下会更快。==每个StringBuilder都有一个容量,只要StringBuilder中包含的字符序列的长度不超过容量,就不需要分配新的内部缓冲区。如果内部缓冲区溢出,它会自动扩容
。
==StringBuilder的实例对于多线程使用是不安全的。如果需要此类同步,则建议使用StringBuffer。==除非另有说明,否则将null参数传递给此类中的构造函数或方法将导致引发NullPointerException。
二、StringBuilder类的构造方法
StringBuilder的构造方法其实都是调用了父类AbstractStringBuilder的构造方法,总的来说无非就是是否指定初始字符序列
、是否指定初始容量
,注意指定了初始字符序列后容量=字符序列的长度+16,为以后的append
和insert
等操作预留了空间。
1 | public StringBuilder() { |
1 | public StringBuilder(int capacity) { |
1 | public StringBuilder(String str) { |
1 | public StringBuilder(CharSequence seq) { |
三、StringBuilder类的方法
与构造函数类似,StringBuilder的所有方法基本都是通过调用父类的相应方法实现的,重点在于父类AbstractStringBuilder
,参考之前的AbstractStringBuilder类源码剖析。
四、StringBuilder类的toString方法
toString
方法会创建一个新字符串(深拷贝
),不会共享底层存放字符数据的字节数组,因此时间复杂度与空间复杂度都是O(n)。
1 | public String toString() { |
五、StringBuilder类的序列化/反序列化
writeObject
方法将StringBuilder实例的状态保存到流中,也就是序列化实例。defaultWriteObject
方法可以简单理解一下:
1 | private void writeObject(java.io.ObjectOutputStream s) |
readObject
方法从流中恢复StringBuilder实例的状态,也就是反序列化。defaultReadObject
方法与defaultWriteObject
方法类似。
1 | private void readObject(java.io.ObjectInputStream s) |