AbstractStringBuilder 是 StringBuilder 和 StringBuffer 的共同抽象父类,封装字符数组管理、扩容机制及增删改查等核心逻辑,不对外公开且不保证线程安全;它使用 char[] value 存储数据,维护 count(有效长度)和数组长度(容量),所有操作基于原数组进行,避免频繁创建新对象;扩容时采用 Math.max(2 * 当前容量 + 2, minimumCapacity) 策略并复制内容;所有写操作均未同步,由子类决定是否加锁;严格校验索引范围,仅提供包私有构造器,不实现 toString(),专注抽离与线程模型无关的通用缓冲逻辑。

AbstractStringBuilder 是 StringBuilder 和 StringBuffer 的共同父类,它封装了字符串缓冲区的核心操作逻辑,比如字符数组管理、扩容机制、增删改查等。它本身是 抽象类,不对外公开,也不实现线程安全——线程安全由子类(StringBuffer)自行加锁保证。
字符数组与容量管理
它用一个 char[] value 存储实际字符数据,并维护两个关键字段:
-
count:当前有效字符个数(即“长度”,不是容量) -
value数组长度:即当前分配的容量(capacity)
所有追加、插入、删除操作都基于这个数组展开,不会直接创建新字符串对象,避免频繁内存分配。
动态扩容策略
当操作超出当前容量时(如 append("long text")),会触发扩容。核心方法是 expandCapacity(int minimumCapacity):
立即学习“Java免费学习笔记(深入)”;
- 新容量 =
Math.max(2 * 当前容量 + 2, minimumCapacity) - 使用
Arrays.copyOf(value, newCapacity)创建更大数组并复制内容 - 这个公式兼顾效率和空间:翻倍+2 避免小步扩容,又防止过度分配
统一的修改逻辑(非线程安全版)
所有写操作(append、insert、delete、replace、setCharAt 等)都在此类中实现,特点是:
- 不做同步,把锁的职责留给子类(
StringBuffer方法加synchronized,StringBuilder不加) - 大量复用底层方法,例如
append(String str)最终调用getChars(...)+System.arraycopy(...) - 边界检查严格:每次访问前校验索引是否在
[0, count]范围内,越界抛IndexOutOfBoundsException
不暴露构造器,也不允许直接实例化
AbstractStringBuilder 构造器是包私有(AbstractStringBuilder(int capacity)),仅限同包下的 StringBuilder 和 StringBuffer 调用。它不提供 public 构造器,也不实现 toString()(该方法由子类重写,返回新构建的 String 对象)。
它的设计目标很明确:抽离可复用的、与线程模型无关的字符缓冲操作,让子类专注差异化部分——一个是性能优先,一个是线程安全优先。


















