算法题中必须用stringbuilder而非string拼接,因其可将时间复杂度从o(n²)降至o(n);需预估容量避免扩容开销,优先使用append()链式调用,禁用+=和循环内tostring(),单线程下不用stringbuffer。

算法题里处理字符串,StringBuilder 不是“可选”,而是“必须用”。核心原因就一个:String 拼接在循环中会退化成 O(n²),而 StringBuilder 能稳住 O(n)——题目数据量一上万,不用它基本超时。
拼接操作一律用 append(),别碰 +=
循环里写 s += "a" 看似简洁,实则每次都在创建新 String 对象,复制全部已有字符。10⁴ 次循环可能复制上亿字符。StringBuilder 的 append() 是直接往内部 char[] 末尾写,支持 char、int、boolean、String、Object 等类型,无需 String.valueOf() 转换。
- 正确写法:
sb.append("abc").append(42).append(true)(链式调用更紧凑) - 避免写法:
sb.toString() + "x"或在循环里反复sb.toString()
提前预估容量,避开频繁扩容
默认初始容量是 16,扩容公式为 新容量 = 旧容量 × 2 + 1。每次扩容都要复制原数组,对大规模输入(如 LeetCode 输入长度 ≥ 10⁴)影响明显。
- 已知最终长度:直接
new StringBuilder(1024),比如拼接 5000 个数字,每个最多 6 位,预留 30000 容量 - 不确定但有上限:用
ensureCapacity(min)提前兜底,但构造时设好更高效 - 小数据量(如拼 3–5 次)可忽略,但算法题普遍不在此列
翻转、删减、插入用内置方法,别手写
StringBuilder 提供的原生方法都是基于 char[] 的原地操作,比手动遍历或拆成数组再拼快且安全。
- 反转直接
sb.reverse(),底层双指针交换,一行顶十行 - 删段用
delete(start, end)(左闭右开),删单字符用deleteCharAt(i) - 插入用
insert(i, str),i可等于当前长度(即追加到末尾) - 替换用
replace(start, end, str),比先删后插更简洁
单线程场景下,只用 StringBuilder,不用 StringBuffer
算法题全是单线程执行,StringBuffer 所有方法加了 synchronized,带来无谓锁开销,实测慢 10%–20%。
- 错误示范:
new StringBuffer().append(...) - 正确选择:
new StringBuilder(预估容量),全程复用同一个实例 - 切记:不要在循环内
new StringBuilder(),否则扩容和对象创建开销白费
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











