stringbuilder.append()拼接字符串高效的关键是初始化足够容量、复用实例、避免隐式装箱和过早tostring()。预估总长度初始化容量,循环中复用同一实例并用setlength(0)清空,优先调用原生类型append方法,仅最终需要时才tostring()。

直接用 StringBuilder.append() 拼接大量字符串本身就很高效,关键在于初始化容量和避免重复扩容。
初始化足够大的初始容量
每次 append 超出当前容量时,StringBuilder 会自动扩容(通常是翻倍),触发数组复制,带来额外开销。如果能预估最终字符串总长度,提前设好容量,就能大幅减少扩容次数。
- 估算所有待拼接字符串的总字符数(包括分隔符、换行符等)
- 用
new StringBuilder(estimatedTotalLength)初始化 - 例如:拼接 1000 个平均长度 50 的字符串,加 999 个逗号,则初始容量建议设为
1000 * 50 + 999 ≈ 51000
优先复用同一个 StringBuilder 实例
避免在循环或高频调用中反复创建新对象。把 StringBuilder 作为局部变量在单次拼接任务中复用,或在工具方法中传入已存在的实例。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 不要这样:
for (...) { new StringBuilder().append(...).toString(); } - 推荐这样:
StringBuilder sb = new StringBuilder(cap); for (...) { sb.append(...); } return sb.toString(); - 若需多次拼接,可调用
sb.setLength(0)清空内容,比新建更轻量
注意 append 的参数类型选择
传入 String、char[]、基本类型或 CharSequence 都是高效操作,但应避免隐式装箱或临时对象生成。
- 拼接数字时,用
append(int)比append(String.valueOf(i))少一次字符串创建 - 拼接 char 数组片段,用
append(char[], start, len)避免子串截取开销 - 避免在循环内拼接 null 值——
append(null)会写入 "null" 字符串,如需跳过,先判空
不需要 toString() 就别调用
toString() 会创建新的不可变 String 对象,并复制全部字符。如果后续还要继续拼接,就别急着转成 String。
- 只在最终需要字符串结果时才调用
toString() - 如果只是传给日志、JSON 序列化等支持 CharSequence 的 API,可直接传 StringBuilder 实例(部分框架支持)
- 调用
toString()后原 StringBuilder 仍可继续使用,但已无共享底层数组优势
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










