stringbuffer与stringbuilder核心区别在于线程安全:stringbuffer所有public修改方法加synchronized且含tostringcache字段优化,stringbuilder则无同步且每次tostring都新建对象,二者共用abstractstringbuilder底层实现。

直接看源码是最硬核的分析方式。JDK 中 StringBuffer 和 StringBuilder 的区别,核心就藏在两者的类声明、方法修饰和少量特有字段里,不需要逐行读完全部代码,抓住三个关键点就能一目了然。
看类定义和继承关系
两者都继承自 AbstractStringBuilder,共用同一套底层逻辑(数组存储、扩容策略、append/insert 实现等)。真正差异只体现在“包装层”:
-
StringBuffer:类声明为
public final class StringBuffer extends AbstractStringBuilder implements Serializable, CharSequence,且所有 public 修改方法(如append、insert、delete)都带synchronized修饰符 -
StringBuilder:类声明为
public final class StringBuilder extends AbstractStringBuilder implements Serializable, CharSequence,方法体几乎完全复用父类,但不加 synchronized
看同步机制的具体实现
以 append(String) 方法为例:
- StringBuffer 中:
public synchronized StringBuffer append(String str)—— 锁的是当前实例(this),整个方法执行期间其他线程无法进入 - StringBuilder 中:
public StringBuilder append(String str)—— 没有锁,直接调用super.append(str),纯粹操作内部byte[] value数组
这就是线程安全与不安全的全部来源:不是底层数据结构不同,而是是否加了一把锁。
看 toString 缓存优化细节
StringBuffer 多了一个私有字段:private transient String toStringCache。每次修改(如 append)都会置为 null;调用 toString() 时,若缓存非空就直接复用,否则才复制数组生成新 String。
- StringBuilder 没有这个字段,每次
toString()都会新建 String 对象 - 这个设计只为缓解多线程下频繁 toString 的开销,属于针对性优化,不影响功能本质
本质上,StringBuilder 就是 StringBuffer 去掉 synchronized + 去掉 toStringCache 的轻量版。JDK 5 引入它,就是为单线程场景砍掉不必要的同步成本。











