StringBuilder非线程安全,因无synchronized同步机制;StringBuffer线程安全,所有方法加synchronized,但性能更低;单线程拼接首选StringBuilder,多线程共享场景必须用StringBuffer。

Java 中 StringBuilder 是高频面试考点,重点不在背定义,而在理解“为什么用它”“什么时候不能用”“和谁对比更关键”。突击训练要直击本质,不堆概念。
掌握底层结构和可变性原理
StringBuilder 底层用的是 char[] 数组,但没加 final 修饰,所以内容可变;而 String 的 value 是 private final char[],一改就得新建对象。这个差异直接决定性能和线程安全性。
- 动手写两段代码:一段用 + 拼接 10000 次字符串,一段用 StringBuilder.append() 做同样操作,对比耗时——这是最直观的原理验证
- 记住关键点:StringBuilder 不是线程安全的,所有方法没加 synchronized;StringBuffer 才加了,所以多线程场景才选 StringBuffer
- 初始容量默认是 16,扩容规则是 oldCapacity * 2 + 2;如果预估长度较大(比如拼接日志),建议显式传参 new StringBuilder(2048),避免反复扩容
明确使用场景和替代边界
面试官常问“什么情况下该用 StringBuilder 而不是 String 或 StringBuffer”,答案要落在具体业务动作上。
- 单线程下大量字符串拼接(如 JSON 组装、SQL 拼接、日志格式化)——首选 StringBuilder
- 循环内拼接字符串,尤其 for 循环里用 + 号,JVM 会自动优化成 StringBuilder,但显式写出更清晰、可控
- 不要在多线程共享实例中用 StringBuilder,哪怕只读也别共用——它没有同步机制,可能引发数据错乱
- 如果只是简单拼接两三个字符串(如 "hello" + name + "!"),编译器已优化,没必要强行套 StringBuilder
准备三层回答逻辑(面试必过关键)
只说“StringBuilder 可变、速度快”会被追问到底;必须能展开“是什么→为什么→我怎么用”。
立即学习“Java免费学习笔记(深入)”;
- 是什么:可变字符序列,非线程安全,基于动态数组实现,提供 append/insert/delete/reverse 等原地修改方法
- 为什么:避免 String 频繁创建新对象带来的 GC 压力;比 StringBuffer 少同步开销,在单线程场景下性能更高
- 我怎么用:在项目里做批量导出时,用 StringBuilder 拼 CSV 行;曾因未预估容量导致扩容 5 次,后来改成 new StringBuilder(8192),导出耗时下降 30%
避开高频陷阱题
这些题看似简单,答错就暴露基础不牢:
- “StringBuilder 和 String 能用 == 比较吗?”——不能,它们是不同类;即使内容相同,== 比的是引用地址
- “StringBuilder.toString() 返回的是新 String 还是原引用?”——返回新 String 对象,内容拷贝,不影响原 StringBuilder
- “StringBuilder 有 length() 和 capacity(),区别是什么?”——length() 是当前字符数,capacity() 是底层数组长度;capacity() ≥ length()


















