java中高效使用stringbuilder拼接字符串的核心是避免重复创建对象、预估初始容量以减少扩容、连续链式调用append并复用实例;其支持多类型自动转换,比手动tostring更简洁高效。

Java 中用 StringBuilder 的 append 方法拼接字符串,核心是避免重复创建对象、预估容量、链式调用,而不是简单“多调几次”。
一次初始化足够容量,减少扩容开销
每次 append 超出当前容量时,StringBuilder 会自动扩容(通常是翻倍),触发数组复制,影响性能。提前用构造函数指定初始容量,能显著减少扩容次数。
- 如果知道最终字符串大概长度(比如拼接 10 个平均长度 20 的字符串),可设初始容量为
new StringBuilder(250) - 不确定长度但有上限(如日志模板最多 512 字符),直接按上限设更稳妥
- 完全无法预估时,至少用
new StringBuilder(64)(默认容量)起步,比无参构造更可控
连续 append 比多次 toString + + 更快
不要写成 str += "a"; str += "b"; 或 s = sb.toString() + "x"——这又回到了 String 不可变导致的重复创建问题。
- 正确做法:复用同一个
StringBuilder实例,连续调用append -
append返回this,支持链式调用:sb.append("name:").append(name).append(", age:").append(age) - 避免中间调用
toString(),除非真需要中途截取结果
append 支持多种类型,无需手动转 String
append 重载了几乎所有基本类型和常见对象(int、boolean、char[]、Object 等),内部自动调用 String.valueOf(),比先转字符串再拼接更简洁高效。
- 推荐:
sb.append(123).append(true).append('c') - 不推荐:
sb.append(String.valueOf(123)).append(String.valueOf(true))—— 多余且易错 - 对自定义对象,确保
toString()合理;若需特殊格式,先格式化再append
复用实例比每次都 new 更省资源
在循环或高频调用场景中,反复 new StringBuilder() 会产生短期对象,增加 GC 压力。可考虑:
- 方法内局部变量:短生命周期、单次使用,直接 new 即可
- 频繁调用的方法(如日志格式化):用
ThreadLocal<stringbuilder></stringbuilder>隔离复用 - 单线程长周期对象:声明为成员变量,每次用前调用
setLength(0)清空,比 new 更轻量
高效拼接不是堆砌 append,而是控制容量、减少对象、合理复用。写法简单,关键在意识和习惯。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











