加号适合简单、固定、编译期可确定的拼接;StringBuilder适合循环、动态、大量拼接。加号对字面量编译优化,但含变量时每次生成新String和StringBuilder;StringBuilder可变、高效、需手动控制容量。

Java中字符串拼接最常用的是加号(+)和 StringBuilder,但两者底层机制、性能表现和适用场景差异很大。简单说:**加号适合简单、固定、编译期可确定的拼接;StringBuilder适合循环、动态、大量拼接。**
加号(+)拼接:编译期优化,运行时可能低效
Java编译器会对用 + 拼接的**字面量字符串**做优化,比如 "a" + "b" + "c" 会被直接编译成 "abc",不创建中间对象。但一旦涉及变量(尤其是非final变量或运行时值),编译器就无法优化,每次 + 都会隐式创建新的 String 对象(因为 String 不可变),并触发 StringBuilder.append() → toString() 流程。
- 例如:str = str + "x" 在循环中执行1000次,会新建约1000个 String 和若干 StringBuilder 实例,内存开销大、GC压力高
- 即使只有两个变量相加,如 s1 + s2,也会生成一个 StringBuilder,调用两次 append,再调用 toString() 返回新 String
StringBuilder:可变、高效、手动控制
StringBuilder 是可变字符序列,内部用 char[] 数组存储,append() 方法直接在数组上追加内容,不产生中间字符串对象。它没有线程安全开销(对比 StringBuffer),是大多数动态拼接场景的首选。
- 推荐显式指定初始容量,避免数组扩容(如 new StringBuilder(128))
- 链式调用很自然:sb.append("name:").append(name).append(", age:").append(age)
- 最终用 sb.toString() 获取结果字符串,只在最后创建一次 String 对象
什么时候用哪个?看场景
- 拼接 2~3 个已知字符串(含字面量):用 + 更简洁,编译器会优化,代码可读性好
- 循环内拼接、日志组装、SQL 拼接、JSON 构建等:必须用 StringBuilder,否则性能急剧下降
- 多线程环境需共享拼接器:选 StringBuffer(同步方法),但通常建议避免共享,优先用局部 StringBuilder
- JDK 9+ 字符串拼接有 StringConcatFactory 优化,但仅对编译期常量组合生效,不影响运行时变量拼接逻辑
小提醒:别忽略 String.join 和 formatted
如果拼接的是集合元素(如 List
立即学习“Java免费学习笔记(深入)”;










