stringbuilder 性能关键在预设容量、只用 append()、明确 null 处理和 tostring() 时机;避免混用 +、循环内 tostring() 或误用场景。

用 StringBuilder 拼接字符串本身不难,但真正影响性能和稳定性的,往往是几个容易被忽略的细节。关键不在“用了没”,而在“怎么用”。
预设容量比默认构造更稳
StringBuilder 默认初始容量是 16,一旦超出就触发扩容(通常是翻倍+2),而每次扩容都要复制整个底层数组——这是隐藏开销的主要来源。
- 能预估最终长度时,直接指定容量:比如拼接 200 个平均 15 字符的字符串加逗号分隔,总长 ≈ 200×15 + 199 ≈ 3200,可写 new StringBuilder(3200)
- 不确定但数据量大,宁可略高估(多留 10–20 字符余量),也别频繁扩容
- 避免用 ensureCapacity() 补救——它只扩不缩,还多一次方法调用
所有拼接必须走 append(),禁用 += 和 +
StringBuilder 的价值在于复用内部 char 数组。一旦混用 sb.append("a") + "b" 或 sb.toString() + "c",就会立刻创建新 String 对象,让前面所有优化失效。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 坚持链式调用:sb.append("id:").append(id).append(", name:").append(name)
- 不要写 sb.append("a" + "b")——编译器会先生成临时 StringBuilder,白费力气
- 循环内绝对禁止 String s = ""; s += item;,1000 次迭代可能产生上千个中间对象
null 处理和 toString() 时机要明确
append(null) 会转成字符串 "null",不是空字符串;toString() 是获取结果的必经步骤,不是可选项。
- 业务不允许 null 字面值时,提前判空或用 Objects.toString(x, "")
- 拼接完成后必须调用 toString(),否则拿不到 String 实例
- 避免在循环中反复调用 toString()——每次都会复制整个数组,开销是 O(n)
- 去尾逗号等简单修改,优先用 sb.delete(sb.length()-1, sb.length()),比 substring 更高效
别在错的场景硬套 StringBuilder
它不是万能银弹。编译期就能确定的少量拼接(比如 1–2 次静态字符串连接),用 + 更简洁,JDK 会自动优化为 StringBuilder。
- 适合 StringBuilder 的典型场景:循环拼接、SQL/JSON/HTML 动态生成、日志组装等热路径
- 只是把 List
用逗号连起来?直接用 String.join(",", list),语义清晰、自动跳过 null、性能不输 - 需要跨线程共享拼接结果?别共享 StringBuilder 实例,拼完再发布不可变 String
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










