直接用stringbuilder预估容量初始化并全程复用,是高效拼接大量字符串、减少内存开销的核心做法;需估算总长度(如2500)、避免循环新建、禁用中途tostring、优选匹配的append重载方法。

直接用 StringBuilder 预估容量初始化,避免频繁扩容,是高效拼接大量字符串并减少内存开销的核心做法。
初始化时指定足够大的容量
StringBuilder 底层基于字符数组,默认初始容量为 16。若拼接内容远超该值,会触发多次数组扩容(每次约扩大 1.5 倍),产生额外对象和内存复制开销。
- 估算总长度:比如拼接 100 个平均长度为 20 的字符串,加上分隔符(如逗号+空格共 2 字符),预估总长 ≈ 100 × 20 + 99 × 2 ≈ 2198,可取 2200 或稍大(如 2500)
- 构造时传入:`StringBuilder sb = new StringBuilder(2500);`
- 不确定精确长度时,宁可略高估,也不要低估——一次到位比多次扩容更省资源
避免链式调用中重复创建实例
不要在循环或高频拼接逻辑里反复 `new StringBuilder()`,尤其不能写成 `sb.append(...).append(...)` 后又丢弃引用重新 new。
- 复用同一个实例:在单次拼接任务中,只创建一次,循环调用
append() - 注意作用域:局部变量即可,无需 static 或全局缓存(多线程不安全,且易引发状态残留)
- 错误示例:
String s = new StringBuilder().append(a).append(b).toString();—— 每次都新建,浪费初始化开销
优先用 append 而非 toString + 连接
不要在拼接中途频繁调用 toString() 获取中间结果再继续拼,这会提前固化当前内容,失去后续追加的优化机会,还可能触发无谓的字符串对象分配。
- 正确方式:全程用
append()累积,最后仅调用一次toString() - 如需中间检查,可用
sb.length()或sb.charAt(i),避免生成临时字符串 - 若必须截取片段,考虑
sb.substring(start, end)(JDK 10+ 返回的是真正子串,不共享底层数组)
批量拼接时善用重载方法
StringBuilder 提供多种 append() 重载,针对不同输入类型做了优化,应按实际参数选择最匹配的版本。
- 拼接字符串字面量或已知 String 对象:用
append(String) - 拼接基本类型(int、long 等):直接
append(int),比先转成 String 再拼更快(跳过包装和格式化) - 拼接 char 数组:用
append(char[], offset, len)避免创建新 String - 已有 StringBuilder 或 StringBuffer 实例:用
append(CharSequence)直接复制底层数据,效率高于转成 String
不复杂但容易忽略——关键就在初始化容量和全程复用。做对这两点,90% 的字符串拼接性能问题就解决了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











