StringBuffer 通过继承 AbstractStringBuilder 复用字符数组,直接使用父类的 protected char[] value 和 int count 字段,所有修改操作、扩容逻辑及 toString 实现均由父类提供,自身仅添加 synchronized 保证线程安全。

StringBuffer 通过继承 AbstractStringBuilder 复用字符数组,核心在于父类已封装好 char[] value、int count 等关键字段和扩容、复制、修改等基础逻辑,子类无需重复定义,直接调用即可。
字符数组由父类统一管理
AbstractStringBuilder 内部声明了 protected char[] value 和 protected int count,StringBuffer 不再声明自己的数组,而是直接使用 inherited 的 value 数组存储字符。所有 append、insert、delete 等操作都走父类的实现,自动维护 count 和数组边界。
- 构造时调用父类构造器(如 super(capacity)),完成 value 初始化和容量分配
- value 数组在 AbstractStringBuilder 中被所有子类共享,避免冗余字段和重复内存申请
- StringBuffer 只需专注线程安全——给 public 方法加 synchronized,不碰数组管理逻辑
扩容逻辑完全复用
当 append 或 insert 超出当前容量时,StringBuffer 调用父类 ensureCapacityInternal(int minimumCapacity),该方法检查是否需要扩容,并执行 Arrays.copyOf 扩容 value 数组。整个过程对 StringBuffer 透明,无需重写 grow 或 newCapacity。
- 扩容触发条件由父类统一判断:minimumCapacity > value.length
- 新容量计算策略(如 oldCapacity * 2 + 2)也在 AbstractStringBuilder 中固定,子类不干预
- 扩容后 value 指针仍指向新数组,count 不变,后续操作继续使用同一引用
线程安全与数组访问分离
StringBuffer 把「数据结构操作」和「并发控制」解耦:所有修改 value 的逻辑(如 arrayCopy、setCharAt)都在父类中非同步实现;StringBuffer 自己只负责加锁,保证同一时刻只有一个线程进入这些方法。
立即学习“Java免费学习笔记(深入)”;
- 例如 append(String str) 方法体只是 synchronized { super.append(str); return this; }
- value 数组本身不加 volatile 或 final 修饰,因为同步块已保证可见性与原子性
- 这种设计让字符数组复用不破坏线程安全性,也不增加额外内存或拷贝开销
toString 复用父类快照机制
StringBuffer 的 toString() 直接调用父类实现,内部基于当前 value 和 count 构造新 String:new String(value, 0, count)。它不缓存字符串,也不深拷贝数组,而是利用 String 的不可变特性安全共享底层数组片段。
- value 数组可能比实际内容长(有未使用空间),但 new String 构造器只复制 [0, count) 区间
- 即使后续 StringBuffer 继续修改 value,已生成的 String 不受影响(String 拷贝的是副本)
- 这个机制依赖父类对 count 的精确维护,子类无需干预数组切片逻辑


















