StringBuilder.append()的核心价值在于通过复用内部char[]数组避免String不可变导致的频繁对象创建,采用动态扩容策略、支持链式调用、非同步设计提升单线程性能,并强调预设容量、避免toString()滥用及混用+操作等最佳实践。

Java中StringBuilder.append()方法的核心价值在于:它绕开了String不可变带来的频繁对象创建开销,通过复用内部字符数组实现高效拼接。关键不在“能追加”,而在“怎么追加得又快又省”。
append()如何避免反复创建对象
每次调用append()时,它并不生成新字符串,而是直接向StringBuilder持有的char[] value数组末尾写入数据。这个数组初始容量为16,当空间不足时自动扩容——不是简单加1,而是按“当前容量×2 + 新增长度”策略扩大,减少后续扩容次数。比如追加一个长度为5的字符串后数组满,下次扩容会设为约32+5=37个字符的空间,而非仅加5。
- 所有重载版本(
append(String)、append(int)、append(boolean)等)最终都转换为字符序列写入同一数组 - 数字和布尔值会先转成字符串形式(如
true→"true"),再逐字符拷贝 - 传入
null时,会写入字符'n''u''l''l'四个字母,而非抛异常
链式调用背后的返回值设计
每个append()方法都返回this(即当前StringBuilder实例),这使得连续调用成为可能:
sb.append("a").append(1).append('!');
立即学习“Java免费学习笔记(深入)”;
这种设计不依赖额外对象封装,纯粹靠引用传递完成,没有性能损耗。底层就是方法末尾一句return this;,轻量且直观。
线程安全与性能取舍
StringBuilder的append()是非同步的,而StringBuffer同名方法用了synchronized修饰。这意味着:
- 单线程下,
StringBuilder.append()比StringBuffer.append()快约10%–20%,因省去锁开销 - 多线程共享同一实例时,必须自行同步或改用
StringBuffer,否则可能产生数据错乱(如两个线程同时写入导致字符覆盖) - 若只是局部变量(如方法内新建、用完即弃),
StringBuilder是默认推荐
实际使用中的几个关键细节
很多人知道该用append(),却忽略初始化容量和类型匹配的影响:
- 预估最终长度,用带参构造器指定初始容量,可大幅减少扩容次数。例如拼接1000个平均长度10的字符串,直接
new StringBuilder(10000)比默认16更高效 - 避免在循环里反复调用
toString()——它会复制整个数组生成新String,应留到最后一次性调用 - 不要混用
+和append():比如sb.append("name=" + name),其中"name=" + name仍触发String拼接,失去优化意义;应拆成sb.append("name=").append(name)
不复杂但容易忽略。


















