StringBuffer是线程安全的可变字符序列,通过synchronized保证并发安全,适合多线程拼接;构造方式含默认容量16、指定容量及字符串初始化;核心方法如append、insert等均返回this并支持链式调用;length()为实际长度,capacity()为底层数组容量;toString()返回新String对象。

Java 中 StringBuffer 是面试高频考点,重点不在死记方法名,而在理解其线程安全、可变性、性能特点及与 StringBuilder 和 String 的本质区别。面试官常通过方法使用场景考察你是否真懂底层逻辑。
构造与初始化:别只写 new StringBuffer()
要能说出三种常用构造方式及其适用场景:
-
new StringBuffer():初始容量为 16,适合不确定长度的拼接 -
new StringBuffer(int capacity):预设容量,避免频繁扩容(扩容规则:oldCapacity * 2 + 2),适合已知大致长度的场景 -
new StringBuffer(String str):以字符串内容初始化,容量 = 字符串长度 + 16,适合基于原字符串做修改
增删改查核心方法:紧扣“可变”和“线程安全”来解释
不用背全,但以下 5 个必须说清作用、返回值类型和典型用法:
-
append(x):追加任意类型,返回this(支持链式调用),是拼接主力 -
insert(int offset, x):在指定位置插入,注意下标越界会抛StringIndexOutOfBoundsException -
delete(int start, int end):删除 [start, end) 区间字符,end可超长(自动截断) -
replace(int start, int end, String str):用新字符串替换指定区间,也是左闭右开 -
reverse():原地反转,返回this,常用于回文判断或字符串倒序处理
toString() 和 capacity()/length():区分两个“长度”
这是高频混淆点,必须讲清楚:
立即学习“Java免费学习笔记(深入)”;
-
length():当前实际字符个数,随增删实时变化 -
capacity():底层数组总容量,只在扩容时增长,通常 ≥length() -
toString():返回一个 新创建的不可变 String 对象,不是引用原缓冲区,后续修改 StringBuffer 不影响该 String
线程安全怎么体现?不能只答“synchronized”
要结合源码级理解:
- 所有 public 修改方法(
append、insert、delete等)都加了synchronized,锁的是当前对象实例 - 这意味着多线程并发调用同一个 StringBuffer 实例是安全的,但会带来同步开销
- 如果单线程环境,优先用
StringBuilder(同接口但无 synchronized),性能提升明显
提醒:面试时被问“为什么 StringBuffer 比 String 拼接快”,别只答“可变”,要补一句:“因为避免了每次拼接都新建对象和复制字符数组”。


















