stringbuilder性能优势在于避免频繁创建临时对象:其底层基于可变字符数组,append等操作原地修改,仅最后tostring()生成一个string实例,相比string拼接o(n²)复杂度和大量gc压力,性能提升可达百倍。

StringBuilder 的性能优势,核心在于它避免了频繁创建临时字符串对象。String 每次拼接都生成新实例,而 StringBuilder 直接在内部字符数组上修改,内存复用率高、GC 压力小。
为什么 StringBuilder 不产生临时对象
StringBuilder 底层继承自 AbstractStringBuilder,持有可变的 byte[] value(Java 9+)或 char[] value(Java 8 及之前),所有 append、insert、delete 等操作都在该数组上原地进行:
- 容量足够时:仅更新内部 count 计数器,不分配新内存
- 容量不足时:触发一次扩容(通常为 原容量 × 2 + 2),复用已有数组内容,仍只新建一次数组
- 全程无 String 对象生成,toString() 仅在最后调用时才构建一个最终 String 实例
对比 String 拼接的开销
用 str += "x" 在循环中拼接 10000 次,实际等价于连续执行:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- new String(...) → new String(...) → new String(...) ……(共约 10000 个中间对象)
- 每次都要拷贝前序全部字符,时间复杂度趋近 O(n²)
- 大量短命对象进入年轻代,频繁触发 Minor GC
单线程下 StringBuilder 的典型收益
在 JDK 17+ 环境中实测(10⁵ 次单字符追加):
- String 拼接:耗时约 80–120ms,堆内存瞬时增长超 20MB
- StringBuilder:耗时约 0.3–0.6ms,内存增量仅数百 KB
- 性能差距可达 100 倍以上,且随数据量增大愈发显著
使用时的关键注意点
发挥 StringBuilder 性能优势需配合合理写法:
- 初始化时预估容量,如 new StringBuilder(1024),减少扩容次数
- 避免在循环内反复调用 toString(),它会额外创建 String 对象
- 不要在多线程间共享同一 StringBuilder 实例,否则结果不可预测
- 若需线程安全,优先考虑 ThreadLocal
,而非降级为 StringBuffer
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










