stringbuilder 的 append 方法高效源于复用字符数组、避免频繁创建对象,预设容量可减少扩容,链式调用无中间对象,单线程下比 stringbuffer 更轻量。

Java 中 StringBuilder 的 append 方法之所以高效,核心在于它**避免了频繁创建新字符串对象**,底层基于可扩容的字符数组(char[]),所有拼接操作都在原数组上进行,只有容量不足时才触发一次数组扩容(通常按 1.5 倍增长)。
预估初始容量,减少扩容次数
每次扩容都要新建数组、复制旧内容,是性能损耗点。若能预估最终字符串长度,构造时直接指定容量,可大幅减少甚至避免扩容。
- 例如拼接 10 个平均长度为 20 的字符串,加上分隔符共约 210 字符 → 建议初始化容量为
new StringBuilder(256) - 不确定时,宁可略大勿小;默认无参构造容量为 16,小数据没问题,大数据极易多次扩容
连续调用 append 比 + 或 String.concat 更快
+ 在循环中会隐式创建多个 StringBuilder 实例;String.concat 每次都生成新字符串。而显式复用一个 StringBuilder 实例,append 只做数组索引赋值和长度更新。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 推荐:
sb.append("a").append(123).append(true);—— 链式调用,无中间对象 - ❌ 避免:
s = s + "a" + 123 + true;—— 循环中等于创建 N 个临时 StringBuilder 和 N 个 String
注意 append 的重载方法,避免隐式装箱或 toString()
append 对基本类型(int、boolean 等)有专门重载,直接写入对应字符序列;若传入包装类(如 Integer),会自动拆箱后调用基本类型重载,安全;但若传入自定义对象且未重写 toString(),可能触发不必要开销或输出 ClassName@hash。
- 优先用基本类型参数:如
append(42)而非append(new Integer(42)) - 拼接对象前确认其
toString()行为合理,或显式调用并校验
单线程场景下,StringBuilder 比 StringBuffer 更轻量
StringBuffer 的所有方法都是同步的,带来锁开销;StringBuilder 无同步,适合绝大多数单线程拼接场景(如 Web 请求内处理日志、SQL 拼装、JSON 组装等)。
- 除非明确在多线程共享同一个实例,否则一律选
StringBuilder - 多线程各自新建局部变量使用
StringBuilder完全安全,无需同步
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










