java中应优先使用stringbuilder替代string拼接:循环外创建、预估容量、复用实例(setlength(0))、延迟tostring(),避免频繁创建临时对象和扩容开销。

Java 中 String 是不可变的,每次拼接都会生成新对象,频繁操作会带来大量临时对象和 GC 压力。StringBuilder 是可变的字符序列,复用内部 char 数组,能显著减少临时 String 对象的创建。
避免在循环中用 + 拼接字符串
编译器虽会对简单 + 做优化(转为 StringBuilder),但复杂场景(如循环内拼接)无法优化,会反复创建 StringBuilder 和 String。
- ❌ 错误写法:每次迭代都 new StringBuilder → toString() → 产生新 String
- ✅ 正确写法:在循环外创建 StringBuilder,循环内调用 append()
例如遍历 list 拼接元素:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
StringBuilder sb = new StringBuilder();<br>
for (String s : list) {<br>
sb.append(s).append(",");<br>
}<br>
String result = sb.toString(); // 仅此处产生 1 个 String
预估容量,减少数组扩容开销
StringBuilder 内部用 char[] 存储,初始容量 16。若最终长度远超默认值,会多次扩容(复制数组),影响性能且产生中间数组对象。
- 构造时传入合理初始容量,如
new StringBuilder(estimatedLength) - 估算方法:已知拼接项数量 × 平均长度 + 分隔符长度
- 宁可略大,避免频繁 resize
复用 StringBuilder 实例(线程安全需注意)
在单线程场景下,可复用同一 StringBuilder 实例,调用 setLength(0) 清空内容,比新建更轻量。
-
sb.setLength(0)不释放数组,仅重置长度指针,无内存分配 - 不要用
sb.delete(0, sb.length())或new StringBuilder()替代 - 多线程必须每个线程独立实例,或改用 StringBuffer(同步开销大,不推荐)
慎用 toString() 触发不必要的 String 创建
toString() 返回当前内容的新 String 对象。如果后续还需修改 StringBuilder,应延迟调用。
- 避免重复调用:如
sb.toString().length()后又继续 append() - 必要时先记录 length:用
sb.length()获取当前字符数,无需转 String - 只有真正需要 String 类型(如传参、返回、比较)时才调用 toString()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










