stringbuilder性能优化关键在预估容量、链式append、及时tostring:初始容量需按总长预设避免频繁扩容;拼接全程用append()禁用+混用;null需判空处理,tostring()仅末尾调用一次。

用 StringBuilder 拼接长字符串,核心不在“用了没”,而在“怎么设、怎么拼、怎么收”。预估容量、链式追加、及时转串,三步做对,性能提升明显。
初始容量要预估,别靠默认16撑全场
默认容量是 16,一旦超出就会扩容,新容量 ≈ 旧容量 × 2 + 1。每次扩容都要复制整个底层数组,开销不小。比如拼接 500 个平均 20 字符的用户名加逗号分隔,总长约 500×20 + 499 = 10499,直接写 new StringBuilder(10500) 更稳。不确定长度但数据量大(如日志缓冲),宁可设 2048 或 4096,也别让扩容反复发生。
所有拼接走 append(),禁用 += 和 + 混搭
StringBuilder 的价值在于复用内部 char 数组。一旦混用 sb.append("a") + "b" 或循环里写 String s = ""; s += item;,就立刻退化成多次新建 String 对象。推荐链式写法:sb.append("ID:").append(id).append(", name:").append(name)。避免 sb.append("a" + "b")——编译器会先生成临时 StringBuilder,白忙一场。
null 处理和 toString() 时机不能含糊
append(null) 会变成字符串 "null",不是空串;业务不允许时,提前判空或用 Objects.toString(x, "")。拼接完成后必须调用 toString() 才能得到最终 String 实例。别在循环中反复调用它——每次都会复制整个数组,开销是 O(n)。去尾逗号这类小修改,优先用 sb.delete(sb.length()-1, sb.length()),比 substring 更轻量。
别在哪都硬套 StringBuilder
它不是万能解药。纯静态拼接如 "HTTP/" + major + "." + minor,JDK 9+ 编译器会自动优化;两个字符串拼接用 concat() 更直接;List 转逗号串,首选 String.join(",", list)——它已内置优化,还自动跳过 null。StringBuilder 真正该上场的场景是:循环 ≥5 次且单次内容 >10 字符、跨方法拼接、需动态删改、或已知大致长度需控扩容。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











