java中循环内用+拼接字符串性能差,因string不可变导致频繁新建对象和gc;应循环外创建stringbuilder并复用,append()为o(1)均摊操作。

Java 中用 + 拼接字符串在循环里会严重拖慢性能,根本原因是每次 + 都新建 String 对象(不可变),还频繁触发临时对象创建和 GC。用 StringBuilder 就能避免这个问题——它内部用可变的字符数组,append() 是 O(1) 均摊操作。
把循环外初始化 StringBuilder
别在循环里 new StringBuilder(),否则又退化成“每次新建+丢弃”。正确做法是循环前创建一次,复用同一个实例:
- ✅ 正确:StringBuilder sb = new StringBuilder(); for (int i = 0; i
- ❌ 错误:for (int i = 0; i (白建了 n-1 次)
预估容量,减少数组扩容
StringBuilder 底层是 char 数组,扩容要复制旧内容。如果知道最终长度(比如拼接 100 个平均长度 10 的字符串),就提前指定容量:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- StringBuilder sb = new StringBuilder(1000); // 预估总长度
- 不确定时,至少给个合理初始值,比如
new StringBuilder(256),比默认 16 更省扩容次数
循环内只调 append,别混用 toString 或转 String
循环中调 toString() 会生成新 String,破坏累积过程;更糟的是,如果之后继续 append(),等于又做了一次无谓拷贝:
- ✅ 正确:sb.append("a").append("b").append("c");(链式调用,零中间对象)
- ❌ 危险:sb.append("a").toString(); sb.append("b");(前一句生成了废弃 String,后一句还要扩容再写)
循环结束后一次性 toString
所有拼接完成再转成 String,这是唯一需要 toString() 的地方:
- String result = sb.toString(); // 只这里调一次
- 如果后续还要修改,就继续用
sb;如果不再修改,toString()后sb可以丢弃或复用
不复杂但容易忽略:关键不是“用了 StringBuilder”,而是“怎么用”——初始化位置、容量预估、避免中间 toString,这三点卡住了绝大多数性能陷阱。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










