Java中String不可变,频繁用+拼接性能差;应优先用StringBuilder(单线程)或StringBuffer(多线程),避免循环内用+,编译期常量拼接仍可用+。

Java 中 String 是不可变对象,每次用 + 拼接都会创建新对象,频繁操作会带来明显性能开销。要提高效率,关键不是“让 String 变可变”,而是避开重复创建 String 对象,改用专门设计的可变字符串工具。
优先使用 StringBuilder(单线程场景)
StringBuilder 是非线程安全但性能最高的拼接工具,适用于方法内、局部变量等无并发场景。
- 用
new StringBuilder()初始化,避免默认容量(16)频繁扩容;预估长度时可传入初始容量,如new StringBuilder(128) - 链式调用
append(),支持字符串、数字、布尔、char 等多种类型,无需手动转 String - 最后调用
toString()得到最终 String,只在需要时生成一次
示例:
String result = new StringBuilder(64).append("Hello")
.append(" ").append(name)
.append(", age: ").append(age)
.toString();
多线程环境选 StringBuffer
如果拼接逻辑跨多个线程共享(如静态工具方法中),需保证线程安全,此时用 StringBuffer —— 它和 StringBuilder 接口一致,但所有方法加了 synchronized。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- 性能略低于 StringBuilder,但比反复创建 String 或滥用
+高得多 - 除非明确有并发写入需求,否则不推荐默认使用,避免无谓同步开销
编译期拼接仍可用 +,但仅限常量
Java 编译器会对纯字面量字符串拼接做优化,例如 "a" + "b" + "c" 在编译后直接变成 "abc",不产生运行时开销。
- 只要所有操作数都是编译期常量(final 字符串字面量、字面量表达式),+ 就是安全高效的
- 一旦含变量(如
"prefix" + name),就会退化为 StringBuilder 调用(Java 9+)或 StringBuffer(旧版本),但仍是推荐方式 —— 编译器已帮你优化
避免在循环中用 + 拼接字符串
这是最典型的低效写法,容易被忽略:
// ❌ 错误示范:每次迭代都新建 StringString s = "";
for (String item : list) {
s += item; // 实际等价于 new StringBuilder().append(s).append(item).toString()
}
正确做法是把 StringBuilder 提到循环外:
// ✅ 正确:StringBuilder sb = new StringBuilder();
for (String item : list) {
sb.append(item);
}
String result = sb.toString();

















