stringbuilder比string拼接快,因为string不可变、每次+都创建新对象导致o(n²)复杂度,而stringbuilder可变、内部char数组扩容才复制、平均o(1)、整体o(n)。

直接用 + 拼接字符串在循环中会严重拖慢性能,因为每次拼接都生成新对象;而 StringBuilder 是可变的、线程不安全但高效,适合单线程下大量字符串拼接。
为什么 StringBuilder 比 String 拼接快?
String 是不可变的,每次 + 都创建新对象,旧对象等待 GC,时间复杂度接近 O(n²);StringBuilder 内部维护一个 char 数组,扩容时才新建数组并复制,平均操作是 O(1),整体接近 O(n)。
正确初始化容量避免频繁扩容
默认构造函数初始容量是 16,若预估最终长度远超该值,应显式指定容量,减少数组复制次数:
- 知道大概长度:
new StringBuilder(1024) - 基于已有字符串估算:
new StringBuilder(str1.length() + str2.length() + 20) - 不确定时宁可略大,别太小——扩容代价比多占点内存高得多
常用拼接写法与注意事项
优先链式调用 append(),它返回自身,代码简洁且高效:
- 基础类型和对象自动调用
toString():sb.append("id=").append(id).append(", name=").append(name) - 避免在循环里反复调用
toString():sb.append(obj.toString())不如sb.append(obj)(后者内部已处理) - 不要在循环外提前 toString() —— 过早转字符串失去 StringBuilder 的优势
什么时候不该用 StringBuilder?
少量拼接(比如 2~3 个字面量)用 + 更清晰,JVM 会自动优化为 StringBuilder;多线程环境需用 StringBuffer(同步开销大,一般先考虑是否真需要线程安全);若拼接逻辑复杂、涉及模板,可考虑 StringJoiner 或 MessageFormat 等更语义化的工具。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











