StringBuilder性能更高,因其底层用可扩容char[](JDK9+为byte[])直接修改、无锁、扩容公式为oldCapacity×2+2;String不可变导致频繁新建对象,StringBuffer虽可变但加synchronized锁带来开销。

Java 中 StringBuilder 是高频面试考点,但真正能讲清“为什么用它”“和 String、StringBuffer 本质区别在哪”“哪些场景必须用它”的人不多。提分关键不在背 API,而在理解底层机制和设计意图。
知道 StringBuilder 为什么快——不是“可变”,而是“数组扩容策略+无锁”
很多人只答“StringBuilder 可变,String 不可变”,这只能拿基础分。高分答案要指出:
- 内部用 char[](JDK 9+ 是 byte[] + coder)存储,修改时直接操作数组,避免新建对象
- append() 等操作在容量足够时不扩容;扩容时按 oldCapacity * 2 + 2 增长(非固定倍数),平衡空间与复制开销
- 没有 synchronized,单线程下无锁开销;而 StringBuffer 同样逻辑却因同步块损失 10%~20% 性能
会对比 String、StringBuffer、StringBuilder 的适用边界
面试官常追问“什么时候该选哪个”。光说“多线程用 StringBuffer”太浅,要结合真实约束:
- 纯拼接且结果只用一次:优先 StringBuilder(如日志拼接、SQL 拼装)
- 需线程安全且频繁读写共享实例:才考虑 StringBuffer(注意:多数场景其实用 ThreadLocal<StringBuilder> 更高效)
- 字符串内容极少变动或仅作参数传递:String 更安全(不可变性保障哈希一致性、类加载安全等)
能写出避免常见性能坑的代码
很多候选人写 StringBuilder 却没提性能隐患:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 初始化时预估容量:new StringBuilder(1024) 比默认 16 容量减少多次数组复制
- 循环内反复 new StringBuilder:应提取到循环外复用(尤其在 for/while 中拼接)
- 误用 toString() 后继续 append:toString() 返回的是副本,后续 append 不影响原对象,但容易引发误解
能联系 JVM 和实际场景延伸加分点
提到这些,面试官会觉得你真懂:
- JDK 9 字符串压缩(compact strings)后,StringBuilder 内部也适配了 Latin-1 编码,小写字母等单字节字符更省内存
- 在 JSON 序列化、模板渲染(如 Thymeleaf 内部)、日志框架(Log4j2 的 ParameterizedMessage)中,StringBuilder 是底层拼接主力
- StringJoiner 底层就是封装了 StringBuilder,说明 JDK 团队也认可它的核心地位
不复杂但容易忽略:面试时别堆砌方法名,重点讲清楚“为什么这个设计能解决什么问题”。把 StringBuilder 当作一个为性能妥协而生的工具,而不是语法糖。

















