StringBuilder的核心优势是单线程下的高性能,因无同步开销而比StringBuffer快10%~25%,适用Servlet、Spring Bean等单线程场景;局限在于不提供线程安全机制,多线程共用会导致数据错乱。

StringBuilder 的核心优势是单线程下的高性能,局限在于不提供内置线程安全机制。
性能更高:没有同步开销
StringBuilder 所有修改方法(如 append、insert、delete)都不加 synchronized,避免了锁获取、检查和释放的耗时。即使在现代 JVM 中锁优化(如偏向锁、锁消除)已较成熟,无锁路径仍比带锁路径更轻量——尤其在高频字符串拼接场景(如日志组装、JSON 构建)中,实测吞吐量通常高出 10%~25%。
- StringBuffer 的每个公共方法都强制同步,哪怕当前只有单个线程访问
- StringBuilder 直接调用父类
AbstractStringBuilder的实现,路径更短 - 无
toStringCache字段,减少字段写操作和内存占用
适用场景明确:单线程首选
绝大多数业务代码运行在单线程上下文里:Servlet 请求处理、Spring Bean 方法内、Stream 流式计算、单元测试等。这些场景下 StringBuilder 是默认推荐选择。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 循环拼接 10000 次数字,StringBuilder 比 StringBuffer 快约 15%~20%
- 构建 SQL 参数、HTTP 查询串、模板渲染内容,均无需跨线程共享
- 作为局部变量使用(方法内创建、使用、丢弃),生命周期天然隔离
局限很清晰:不保证线程安全
StringBuilder 不做任何并发保护。若多个线程共用同一个实例并同时调用 append 等方法,会出现数据错乱、数组越界或 IndexOutOfBoundsException,且错误不可预测。
立即学习“Java免费学习笔记(深入)”;
- 不是“偶尔出错”,而是“必然不安全”——没有 synchronized 或 CAS 保障
- 不能靠外部加锁简单补救(如
synchronized(sb)),因为内部状态(count、value[])可能被并发修改破坏 - 若需多线程拼接,正确做法是每个线程用独立 StringBuilder,或改用 StringBuffer
兼容性与生态支持一致
两者继承同一父类 AbstractStringBuilder,API 完全一致(方法签名、返回类型、异常类型),底层扩容策略(oldCapacity * 2 + 2)、初始容量(16)、字符数组存储方式也完全相同。
- 替换 StringBuffer 为 StringBuilder 通常只需改类名,无需调整逻辑
- IDE 和静态分析工具(如 SonarQube)会主动提示“非并发场景建议用 StringBuilder”
- Spring、Jackson、MyBatis 等主流框架内部字符串拼接均优先选用 StringBuilder

















