stringbuilder与stringbuffer底层存储结构、扩容逻辑、构造方法及api行为完全一致,唯一区别是stringbuffer方法加synchronized而stringbuilder不加,仅影响线程安全性。

底层存储结构完全一致
StringBuilder 和 StringBuffer 都继承自 AbstractStringBuilder,内部都使用一个可变的 char[] value(JDK 9+ 后为 byte[],配合 coder 字段支持 Latin-1 编码优化)来保存字符序列。数组初始容量默认都是 16,扩容逻辑也完全相同:新容量 = 旧容量 × 2 + 2。这意味着二者在内存布局、字符存取、扩容行为、toString() 实现(均新建 String 对象并复制内容)等底层机制上没有实质差异。
核心区别仅在于同步机制
二者唯一明确的实现级差异体现在方法声明层面:
-
StringBuffer 的所有修改方法(如
append()、insert()、delete()、reverse())都带有synchronized关键字,即每个方法体被绑定到当前对象实例的 monitor 锁上; - StringBuilder 的对应方法完全不加 synchronized,没有任何 JVM 级别的锁保护。
这种差异不是通过不同算法或数据结构实现的,而是纯粹的语法标记——编译后,StringBuffer 方法多出 monitorenter 和 monitorexit 字节码指令,而 StringBuilder 没有。JVM 层面对此的处理(如锁膨胀、偏向锁优化等)已高度成熟,但单线程下无锁路径天然更轻量。
构造与初始化行为相同
两者构造方法签名和语义完全一致:
-
StringBuilder()/StringBuffer()→ 创建容量为 16 的空实例; -
StringBuilder(String str)/StringBuffer(String str)→ 以 str 内容初始化,容量 = str.length() + 16; -
StringBuilder(int capacity)/StringBuffer(int capacity)→ 指定初始容量。
初始化过程均调用父类 AbstractStringBuilder 的构造逻辑,分配数组、设置 length,无任何分支处理。
API 行为表现几乎完全兼容
除线程安全性外,二者对外暴露的全部公共方法(包括返回值类型、参数签名、异常抛出、边界检查逻辑、空值处理等)均严格一致。例如:
-
sb.append(null)在两者中都生成字符串 "null"; -
sb.insert(0, "x")和sb.delete(1, 3)的索引校验规则、越界抛StringIndexOutOfBoundsException的时机完全相同; - 它们都实现了
CharSequence、Appendable、Serializable接口,且序列化字段定义一致。
这种设计使 StringBuilder 可作为 StringBuffer 的“零成本替换”——只需改类名,无需调整调用逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











