算法题中必须用 stringbuilder,因其是可变字符数组,所有操作原地进行,避免 string 拼接的 o(n²) 代价;关键在于理解行为边界、预判路径、克制转 string 惯性。

算法题里处理复杂字符串变换,StringBuilder 不是“能用”,而是“必须用”。它本质是可变字符数组,所有操作都在原地进行,避免 String 那种每次拼接都复制全部内容的 O(n²) 代价。真正高效的关键,在于理解它的行为边界、预判操作路径、并克制住“转成 String 再处理”的惯性。
拼接与动态调整:分步构建不返工
很多题目不是简单连起来,而是边加边删、边插边改——比如生成逗号分隔列表后删末尾逗号,或在模板中填字段再替换占位符。
- 用 append() 追加内容,再用 deleteCharAt(length() - 1) 或 delete(start, end) 精准剔除冗余(注意 delete 是左闭右开)
- 用 insert(0, "prefix") 在开头加标识,或 replace(start, end, "new") 替换固定段
- 别写
s += "x"或sb.toString() + "y",这等于放弃 StringBuilder 的全部优势
跨阶段复用:传参比拼接更省
当逻辑分散在多个方法里(比如 parseHeader()、buildBody()、addFooter()),把同一个 StringBuilder 实例作为参数传入,比各自 new 一个再拼接快得多。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 每个子方法只做自己的 append/insert/delete,不调 toString()
- 不要返回 String 再传给下一个方法,否则又触发不可变复制
- 最终统一调一次 toString() 输出结果
容量预估:避免扩容抖动
默认容量 16,扩容公式是 新容量 = 旧容量 × 2 + 1。拼接 10⁴ 次时,频繁扩容会反复拷贝数组,性能断崖下跌。
- 已知最终长度(如题目限定输出 ≤ 5000 字符):直接 new StringBuilder(5000)
- 可估算(如 10⁵ 个数字,每个最多 10 位):预留 10⁶ 容量 更稳妥
- 不确定但数据量大:宁可高估设 8192 或 16384,比反复扩容强
替换与翻转:用原生方法,别手写
StringBuilder 提供的内置操作都是基于 char[] 的原地修改,比手动拆数组、遍历、再拼快且安全。
- 反转直接 sb.reverse(),一行顶十行,底层双指针交换
- 精准替换某段:先 delete(start, end),再 insert(start, replacement)
- 全局替换子串:用 lastIndexOf() 从后往前找,避免索引偏移;每次找到就 delete+insert
- 慎用 setCharAt(i, c)——只能换单字符,无法处理长度变化
单线程场景下,只用 StringBuilder,不用 StringBuffer。后者所有方法带 synchronized,白费 10%–20% 性能。循环里 new StringBuilder() 也毫无意义——扩容和对象创建开销全白费。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










