java字符串拼接“+”在编译期常量时直接合并为字面量,非编译期常量时转为stringbuilder.append(),jdk9+引入stringconcatfactory动态优化,循环中须手动复用stringbuilder避免性能问题。

Java中字符串拼接 String s = s1 + s2; 在底层**编译期会自动优化为 StringBuilder(或 StringBuffer)调用**,但具体实现取决于上下文:是否在编译期可确定、是否在循环中、JDK 版本等。
编译期常量拼接:直接合并为字面量
如果 s1 和 s2 都是编译期常量(如字面量或 final String),Javac 会在编译时直接合并,不生成运行时拼接代码:
final String s1 = "Hello"; final String s2 = "World"; String s = s1 + s2; // 编译后等价于 String s = "HelloWorld";
这种情况下,字节码中没有 StringBuilder,只有 ldc 指令加载常量池中的结果字符串。
非编译期常量拼接:默认转为 StringBuilder.append()
只要任一操作数是运行时变量(如普通局部变量、方法参数、返回值等),Javac 会将 + 翻译为 StringBuilder 的链式调用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 创建
new StringBuilder() - 依次调用
append(s1)、append(s2) - 最后调用
toString()返回新String
例如:
String s1 = getA(); // 运行时才知内容 String s2 = getB(); String s = s1 + s2; // 编译后近似等价于: // new StringBuilder().append(s1).append(s2).toString();
JDK 9+ 的补充优化:StringConcatFactory
从 JDK 9 开始,JVM 引入了字符串拼接的专用机制 —— StringConcatFactory。它在运行时根据拼接模式(参数数量、类型、是否含 null 等)动态生成高效字节码,可能使用 StringBuilder、数组复制,甚至内联字符拷贝,不再硬编码为固定 StringBuilder 调用。该过程由 JVM JIT 编译器进一步优化,性能通常优于手写 StringBuilder(尤其多段拼接)。
循环中拼接需手动用 StringBuilder
for 循环里写 s += str 是严重性能陷阱:
- 每次
+=都新建一个StringBuilder(JDK 8 及以前)或触发StringConcatFactory逻辑 - 导致 O(n²) 时间复杂度和大量临时对象
应显式声明并复用:
StringBuilder sb = new StringBuilder();
for (String str : list) {
sb.append(str);
}
String result = sb.toString();
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










