StringBuilder高效需预设容量、多用append少用insert、避免隐式字符串拼接。预估总长构造对象;append为O(1),insert最坏O(n);替代多次insert可用分段构建后合并。

Java 中 StringBuilder 的 append 和 insert 方法本身不会“自动”高效——效率高低,取决于你是否预先规划容量、合理选择操作顺序、避免无谓的扩容与移动。
预设足够初始容量,避免频繁数组扩容
StringBuilder 底层用字符数组实现,每次超出当前容量时会创建新数组(通常是 1.5 倍 + 2),再复制旧内容。大量 append 或 insert 若未预估长度,可能触发多次扩容,造成内存浪费和性能下降。
- 估算总长度:把所有待拼接字符串长度加起来,再留 10%~20% 余量
- 构造时直接指定:
new StringBuilder(estimatedTotalLength) - 例如拼接 1000 个平均 50 字符的字符串 → 预估 55000,可写
new StringBuilder(60000)
优先用 append,少用 insert(尤其在开头/中间)
append 是追加到末尾,时间复杂度 O(1)(摊还);insert(int offset, ...) 需要把 offset 后所有字符右移,最坏 O(n),且越靠前插入代价越大。
- 需要“前置内容”,别反复
insert(0, ...),改用append后整体反转,或先存入列表再逆序拼接 - 若必须中间插入(如模板填充),尽量批量处理:先用
toString()转成字符串,用String.replaceFirst或正则替换,再构建新StringBuilder,比多次insert更快 - 插入位置固定且已知?考虑用
setCharAt替代insert(仅限单字符覆盖场景)
避免在循环中隐式 toString() 或混合 String 拼接
常见低效写法:sb.append("prefix" + value + "suffix") —— 这里 "prefix" + value + "suffix" 是 Java 编译器生成的临时 StringBuilder,白建又白丢,还多一次 toString()。
立即学习“Java免费学习笔记(深入)”;
- 正确写法:
sb.append("prefix").append(value).append("suffix") - 循环内不要调用
sb.toString()获取中间结果再拼——除非真需要;否则继续append - 如果 value 是 null,
append(null)会写入字符串 "null";需提前判空:sb.append(value != null ? value : "")
insert 的高效替代方案:分段构建 + 一次合并
当逻辑上需要“在某处插入多段内容”,比如日志模板 "[TIME] [LEVEL] MSG",其中 TIME 和 LEVEL 是动态插入的,不建议:
sb.insert(0, level).insert(0, "] ").insert(0, time).insert(0, "["); // ❌ 多次移动
更优做法:
- 用数组或 List 存各段:
List<CharSequence> parts = Arrays.asList("[", time, "] [", level, "] ", msg) - 一次性
parts.forEach(sb::append),或用String.join("", parts)(JDK 8+)再塞进StringBuilder - 若格式固定,直接用
MessageFormat.format或String.format(注意后者创建新 String,适合不频繁场景)


















