StringBuilder与StringBuffer接口实现完全一致,均实现CharSequence并继承AbstractStringBuilder,核心区别在于同步策略:StringBuffer方法加synchronized保证线程安全,StringBuilder无锁提升性能;toString()上StringBuffer缓存结果而StringBuilder每次新建。

StringBuilder 和 StringBuffer 在接口实现层面几乎完全一致,核心差异不在“是否实现某接口”,而在于同步策略带来的行为差别。
都实现了相同的接口
两者都直接实现 CharSequence 接口,并继承自同一个抽象父类 AbstractStringBuilder。这意味着它们共享: • append、insert、delete、replace、reverse 等全部字符串操作方法签名 • length()、charAt()、subSequence()、toString() 等 CharSequence 规定的行为 • 底层均使用可变的 char[] 数组存储数据,初始容量为 16,扩容策略均为 oldCapacity × 2 + 2
关键区别不在接口,而在方法修饰
接口本身不涉及线程安全,真正区分二者的是具体方法的实现细节: • StringBuffer 的所有公共修改方法(如 append、insert)都用 synchronized 修饰,或内部调用同步块 • StringBuilder 的对应方法完全去掉同步,无锁执行 • 这导致虽然它们“实现的接口相同”,但实际并发调用时语义不同:StringBuffer 保证多线程下操作原子性,StringBuilder 不保证
toString() 实现有细微差异
尽管都重写了 toString() 返回新 String 对象,但底层优化不同: • StringBuffer 内部维护一个 toStringCache 字段,缓存最近一次 toString 结果,避免重复拷贝数组 • StringBuilder 每次 toString 都直接调用 Arrays.copyOfRange(value, 0, count),不缓存 • 这属于实现细节差异,不影响接口契约,但对高频 toString 场景有轻微性能影响
构造与继承关系完全一致
两者构造方法签名完全相同(无参、int 容量、String 初始化、CharSequence 初始化),且都: • 是 final 类,不可被继承 • 不重写 equals() 和 hashCode(),因此不支持按内容比较或作为 Map 键使用 • 与 String 之间只能通过构造函数或 toString() 转换,不存在隐式类型转换


















