stringbuilder 是为解决 string 不可变性导致的频繁对象创建问题而设计的,它通过可变 char[] 数组和 count 标记实现高效拼接,单线程下性能优于 stringbuffer。

学 StringBuilder 面试考点,关键不是死记硬背 API,而是抓住“为什么需要它”和“它怎么解决实际问题”这两条主线。面试官真正想看的,是你是否理解 String 的不可变性带来的性能瓶颈,以及 StringBuilder 如何在单线程场景下高效破局。
紧扣 String 不可变性这个起点
所有关于 StringBuilder 的考点,都源于 String 的不可变性:
- String 每次拼接(如
s += "x")都会创建新对象,原字符串留在堆里等 GC;循环 10000 次,就产生上万个临时对象 - 底层是
final char[]或final byte[],没有提供修改数组内容的 public 方法 - 常量池复用、线程安全、哈希缓存这些优点,都依赖“不可变”这一前提
你得能一句话讲清:StringBuilder 就是为绕过这个限制而生的——它用一个可变的内部字符数组(char[] value),所有 append、insert、delete 都直接操作这个数组,不造新对象。
掌握核心 API 与典型使用模式
面试高频操作不是罗列方法名,而是考你怎么用、为什么这么用:
-
构造时机:无参构造默认容量 16;如果预估最终长度(比如拼接 500 个字符串),建议用
new StringBuilder(512)避免多次扩容 -
链式调用:
sb.append("a").append(123).append(true)是常态,因为每个方法都返回this -
扩容机制:当前容量不够时,新容量 = 原容量 × 2 + 2;超过
Integer.MAX_VALUE - 8会抛 OOM -
转回 String:用
toString(),注意它返回的是新 String 对象(不可变),但内部字符数组是拷贝而非共享
对比 StringBuffer 突出设计取舍
三者对比是必问项,重点不在“谁更好”,而在“谁适合什么场景”:
- StringBuffer 所有方法加了
synchronized,多线程安全但有锁开销 - StringBuilder 去掉同步,单线程下性能高 10%–15%,日常开发(main 方法、Service 层逻辑)默认选它
- 别答“StringBuilder 是 StringBuffer 的非线程安全版”——这是表象;本质是 Java 在不同并发需求下的明确分工
结合代码片段讲清内存行为
光说理论容易空,用小段代码演示更有力:
String s = "a";
s += "b"; // 实际:new StringBuilder("a").append("b").toString()
这行代码背后 JVM 干了三件事:新建 StringBuilder → append → toString()。面试时如果你能点出这点,说明真懂底层。
再比如:
StringBuilder sb = new StringBuilder("ab");
sb.append("c"); // 修改原数组,count 变成 3,value[2]='c',没新对象
强调 count 字段的作用——它标记当前有效字符数,不是数组长度,这是高效的关键。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











