应使用 stringbuilder 替代 + 或 += 进行字符串累加,因其可变且高效,避免 string 不可变导致的大量临时对象;循环内或多次(3次以上)拼接、涉及变量的运行时拼接等场景必须换用。

Java 中用 StringBuilder 替代 + 或 += 进行字符串累加,核心在于避免创建大量临时 String 对象。因为 String 不可变,每次拼接都会生成新对象,而 StringBuilder 是可变的、线程不安全但高效。
什么时候该换用 StringBuilder
当循环内或多次连续拼接字符串(尤其 3 次以上)时,+ 的性能代价明显上升。编译器虽对简单静态拼接做了优化(如 "a" + "b" + "c" 编译为常量),但涉及变量或运行时计算时无法优化。
- 循环中拼接日志、SQL 拼装、JSON 片段等
- 方法内多次调用
str += "xxx" - 构建 HTML 片段、CSV 行、路径字符串等
基础用法:初始化与追加
推荐在创建时预估容量(避免频繁扩容),用 append() 替代 +:
// ❌ 低效 String result = ""; for (int i = 0; i <h3>注意线程安全与复用场景</h3> <p><code>StringBuilder</code> 不是线程安全的,多线程环境下不能共享实例;若需线程安全,改用 <code>StringBuffer</code>(但性能略低)。单线程下可复用同一实例,清空后重用更省资源:</p>
- 方法内局部变量:直接新建,无需担心生命周期
- 频繁调用的方法中:可用
sb.setLength(0)清空内容,比新建更快 - 避免在循环外长期持有并反复
append后忘记toString(),导致内存残留
常见陷阱与优化细节
不是所有拼接都要强行换 StringBuilder。少量、固定拼接(如 "Hello " + name + "!")JVM 会自动优化为 StringBuilder,手动写反而冗余。
- 不要在 for-each 循环里反复
new StringBuilder(),应在循环外创建 - 拼接含 null 时,
append(null)会写入字符串 "null",需提前判空 - 链式调用
append()可读性好,返回自身,支持连续操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











