stringbuilder更快是因为string不可变,每次+或concat都新建对象,而stringbuilder基于可变char数组操作,时间复杂度从o(n²)降至o(n),显著减少内存分配和gc压力。

Java 中字符串拼接用 StringBuilder 比直接用 + 或 String.concat() 更高效,核心原因是避免频繁创建不可变的 String 对象,减少内存开销和 GC 压力。
为什么 StringBuilder 更快?
String 是不可变类,每次用 + 拼接都会生成新对象;而 StringBuilder 是可变的字符缓冲区,内部用 char 数组动态扩容,所有操作都在原对象上进行。尤其在循环中拼接、或拼接次数较多时,性能差距明显。
怎么正确初始化 StringBuilder?
推荐显式指定初始容量,避免多次自动扩容(扩容会触发数组复制)。估算最终字符串长度,传入构造函数:
- 如果知道大致长度(比如拼接 10 个平均长度 20 的字符串),设为
new StringBuilder(200) - 如果不确定,至少比默认容量(16)大些,例如
new StringBuilder(64) - 避免写成
new StringBuilder().append("a").append("b")...而不预估容量,尤其在高频调用场景
常用拼接操作写法
用 append() 方法链式调用,支持多种类型参数(String、int、boolean、null 等),无需手动转字符串:
sb.append("name: ").append(name).append(", age: ").append(age)- 遇到 null 会追加 "null" 字符串,如需空字符串代替,可先判空:
sb.append(name != null ? name : "") - 循环拼接推荐提前
sb.append("["),再在循环内append(item).append(", "),最后去掉末尾逗号或用deleteCharAt()
别忘了最后转成 String
StringBuilder 拼完后,调用 toString() 得到结果字符串。注意这个方法返回的是新 String 对象,但只发生一次,代价可控:
String result = sb.toString();- 不要重复调用
toString()多次——它每次都新建对象 - 如果只是临时用于日志或打印,也可直接
System.out.println(sb)(会自动调用toString())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











