最高效字符串拼接需按场景选择:编译期常量用+,循环拼接用StringBuilder,集合连接用String.join(),多线程环境用StringBuffer。

最高效的字符串拼接写法不是固定一种,而是按场景选:编译期常量用 +,循环拼接用 StringBuilder,集合连接用 String.join(),多线程环境用 StringBuffer。
编译期常量拼接:直接用 + 号
当所有参与拼接的都是字面量或 final 修饰的编译期常量时,Javac 会在编译阶段完成“常量折叠”,生成的字节码里只有一条 ldc 指令加载最终字符串,零对象创建、零运行时开销。
-
String s = "Hello" + " " + "World";→ 编译后等价于String s = "Hello World"; -
final int port = 8080; String url = "http://localhost:" + port;→ 同样触发折叠(port 是 final 且值确定) - 但
String a = "A"; String b = "B"; String c = a + b;不会折叠,因为a、b是变量,非编译期常量
循环内拼接:必须用 StringBuilder
在 for/while 循环中用 str += "x" 是性能陷阱。JDK 8 及以前每次迭代都新建 StringBuilder;JDK 9+ 虽改用 invokedynamic,但仍需动态解析、反复构造和 toString(),无法避免 GC 压力。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 正确写法:提前声明
StringBuilder sb = new StringBuilder(estimatedLength);,循环中只调用append(),最后统一toString() - 预估容量能避免数组多次扩容(默认16,扩容公式为
old * 2 + 2),减少内存拷贝 - 不要在循环体里调用
sb.toString(),那会提前生成中间字符串,失去优化意义
集合或数组拼接:优先用 String.join()
对 List、Array 等已有结构做分隔连接,String.join() 是语义最清晰、实现最精简的选择。它内部使用预分配数组+批量拷贝,跳过首尾判断和手动分隔逻辑,比手写 StringBuilder 更稳定高效。
立即学习“Java免费学习笔记(深入)”;
-
String result = String.join(", ", list);比for循环 +StringBuilder更少出错、更易维护 - 若需前缀/后缀(如
[a, b, c]),可用StringJoiner,它专为此设计,支持链式添加 - 不适用于动态逐个追加的场景——那是 StringBuilder 的地盘
多线程环境拼接:选 StringBuffer
如果多个线程共享同一个拼接器并并发调用,StringBuilder 会引发数据错乱。StringBuffer 所有方法都加了 synchronized,保证线程安全,代价是少量同步开销。
- 单线程下无条件选
StringBuilder;只有明确需要跨线程共享拼接状态时,才换用StringBuffer - 多数日志组装、SQL 构建等场景仍是单线程主导,不必为“可能并发”牺牲性能
- 若需更高并发吞吐,可考虑将拼接任务拆分为局部 StringBuilder + 最终合并,而非全程锁住一个对象


















