StringBuilder默认初始容量为16,预估总长度后使用带参构造器(如new StringBuilder(256))可避免多次扩容;扩容公式为oldCapacity×2+2,合理预设容量能显著减少数组复制开销。

在 Java 中,StringBuilder 默认初始容量是 16。如果预估后续拼接的字符串总长度会远超这个值,直接使用无参构造器会导致多次底层数组扩容(每次扩容约 1.5 倍),带来额外的内存复制开销。因此,合理设置初始容量是减少扩容次数最直接有效的方式。
用带初始容量的构造器创建 StringBuilder
这是最常用、最推荐的做法。根据你预期的最终字符串长度(或略高估一点),传入一个足够大的整数:
- new StringBuilder(100):创建初始容量为 100 的 StringBuilder,底层 char 数组长度就是 100
- 如果拼接后总字符数大概在 200 左右,设为 256 更稳妥(避开边界扩容)
- 注意:初始容量必须 ≥ 0;若为 0,仍会分配长度为 16 的数组(和无参构造一致)
根据已有字符串长度预估初始容量
如果你已有部分字符串(比如前缀),可以用它的长度作为基础再加余量:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- String prefix = "Result: ";
- StringBuilder sb = new StringBuilder(prefix.length() + 512);
- 然后 sb.append(prefix),再继续 append 其他内容
- 这样比先 new 再 append prefix 更高效,避免了 prefix 导致的第一次扩容
避免过度预留,也别严重低估
初始容量不是越大越好,要平衡内存占用与扩容成本:
立即学习“Java免费学习笔记(深入)”;
- 设成 10000 但最终只用 200 字符 → 浪费内存,GC 压力略增
- 设成 32 却要拼 500 字符 → 至少触发 3~4 次扩容(32→48→72→108→162…)
- 经验建议:在预估长度基础上上浮 10%~20%,或取最近的 2 的幂(如 128、256、512)更利于 JVM 内存管理
扩容机制简要说明(便于理解为什么设置有效)
StringBuilder 底层是 char[],扩容逻辑在 expandCapacity() 中:
- 当 count(当前字符数) >= value.length(数组长度) 时触发扩容
- 新容量 = oldCapacity * 2 + 2(JDK 8+),即约 2 倍,不是 1.5 倍(注意区别于 ArrayList)
- 例如:初始 16 → 扩到 34 → 70 → 142 → … 所以初始设大些,能跳过前面多次小扩容

















