stringbuilder的append比string“+”快,因为string不可变,每次拼接都创建新对象并触发gc;stringbuilder可变,复用内部char数组,仅在空间不足时扩容,避免频繁内存分配。

StringBuilder 的 append 方法本身不修改字符串,而是高效地向内部字符数组追加内容——关键在于它避免了创建新对象,复用可变缓冲区。
append 为什么比 String + 快?
String 是不可变的,每次拼接(如 s1 + s2)都会生成新对象,旧对象可能很快被丢弃,带来频繁的内存分配与 GC 压力。StringBuilder 底层维护一个 char 数组,append 只是把新内容复制到数组末尾,并更新长度;只要数组空间够,就完全不新建对象。
预设容量,减少扩容开销
默认构造的 StringBuilder 初始容量是 16。如果预估最终长度远大于 16(比如拼接 1000 个短字符串),反复扩容会触发多次数组复制(类似 ArrayList)。建议初始化时指定足够容量:
-
new StringBuilder(2048)—— 若知道大致总长 -
new StringBuilder(str.length() * 2)—— 若基于某个字符串扩展
链式调用与类型适配
append 方法返回 this,支持链式写法,减少中间变量:
sb.append("name: ").append(name).append(", age: ").append(age).append("!");
它重载了所有基本类型和 Object 的版本,对 null 也安全(自动转为字符串 "null"),无需手动判空或 toString()。
注意“修改”的边界
append 不会改变原字符串字面量或 String 对象,只改变 StringBuilder 自身状态。要获取结果,必须显式调用 toString()(该方法返回新 String,但只在最后做一次):
- 错误:直接 return sb; —— 返回的是 StringBuilder 实例,不是字符串
- 正确:return sb.toString(); —— 仅在最终需要 String 时调用一次
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











