stringbuilder存在是为解决string不可变导致的频繁对象创建与性能损耗;单线程下用于高频字符串拼接修改;本质区别在于:string不可变,stringbuffer可变且线程安全,stringbuilder可变但非线程安全、性能最高。

Java 中 StringBuilder 是面试高频考点,重点不在背 API,而在理解它“为什么存在”“什么时候用”“和 String、StringBuffer 有什么本质区别”。掌握这三点,就能稳住基础题,也能应对进阶追问。
搞懂设计动机:为什么要有 StringBuilder?
String 不可变,每次拼接都生成新对象,大量字符串操作时内存和性能压力大。StringBuffer 和 StringBuilder 都是可变字符序列,底层用 char 数组动态扩容,避免频繁创建对象。但 StringBuffer 所有方法都加了 synchronized,适合多线程;StringBuilder 去掉同步开销,单线程下性能更高——这就是它被广泛推荐的底层原因。
记住关键使用场景
- 循环中拼接字符串(比如遍历 List 构造 CSV 或 JSON 片段)
- 构建 SQL 语句、日志消息、HTML 模板等中间字符串
- 需要多次 append、insert、delete、reverse 等修改操作,且不涉及并发
- 替代“+”拼接(尤其在循环或方法内),避免编译器优化失效导致性能下降
别踩这些常见坑
面试官常从细节里挖深度:
-
默认容量是 16,如果预估长度远超这个值(比如拼接上千字符),建议构造时指定初始容量:
new StringBuilder(2048),减少数组扩容次数 - toString() 返回的是新 String 对象,不是引用;StringBuilder 本身仍可继续修改
- 不能直接用
==比较内容,要调用toString().equals(...) - 它不是线程安全的——哪怕只在局部方法里用,也别把它设为 static 或共享给多个线程
对比记忆更牢靠
三者关系不用死记,抓住一条主线:可变性 → 线程安全 → 性能取舍。
- String:不可变 → 安全但低效 → 适合常量、键名、少量拼接
- StringBuffer:可变 + 同步 → 安全但稍慢 → 旧代码或明确多线程场景
- StringBuilder:可变 + 非同步 → 不安全但最快 → 默认首选,95% 的拼接场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











