优先用 stringbuilder(单线程)或 stringbuffer(多线程),因 string 不可变,+ 拼接在循环中频繁创建对象、触发 gc、时间复杂度近 o(n²);stringbuilder 无同步、性能高,stringbuffer 同步但有锁开销;初始化合理容量、链式调用、避免反复 tostring 可提升效率。

Java 中拼接字符串,优先用 StringBuilder(单线程场景)或 StringBuffer(多线程需同步),避免用 + 或 String.concat() 在循环中反复创建对象。
为什么不用 String 拼接?
String 是不可变的,每次 + 操作都会生成新对象,大量拼接时触发频繁 GC,性能差。比如在 for 循环里写 str += "a",时间复杂度接近 O(n²)。
StringBuilder 和 StringBuffer 的核心区别
两者都可变、支持链式调用(如 append().append()),但同步策略不同:
-
StringBuffer:所有 public 方法加了
synchronized,线程安全,但有锁开销 - StringBuilder:无同步,性能更高,适用于绝大多数单线程场景(如 Web 请求处理、本地计算)
除非明确需要多线程共享并修改同一个实例,否则默认选 StringBuilder。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
高效使用的几个关键点
初始化容量能显著减少数组扩容次数,尤其拼接长度可预估时:
- 构造时传入合理初始容量,比如拼接 100 个平均长度 10 的字符串,可设
new StringBuilder(1000) - 避免用空参构造器后反复
append,导致多次 resize(底层 char[] 扩容是 2 倍+2,代价不小) - 链式调用更简洁:
sb.append("name: ").append(name).append(", age: ").append(age) - 拼接完成后用
toString()获取结果,不要反复调用(它会新建 String 对象)
常见误用和优化示例
错误写法:
String result = "";
for (String s : list) {
result += s; // 每次都新建 String,低效
}
正确写法:
StringBuilder sb = new StringBuilder(list.size() * 16); // 预估容量
for (String s : list) {
sb.append(s);
}
String result = sb.toString();
如果 list 元素较多且长度差异大,也可先用 list.stream().mapToLong(String::length).sum() 计算总长再设容量。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










