StringBuilder是单线程下高性能可变字符串拼接首选,基于可变char[]实现,默认容量16,扩容为旧容量×2+2(JDK11+为×2),预估容量可避免多次复制;非线程安全,区别于String的不可变性和StringBuffer的同步机制。

Java 中 StringBuilder 的面试题,核心是考你对它的原理、使用场景、线程安全性和性能优化的理解,不是背 API。下面按常见考点组织,帮你系统准备。
StringBuilder 和 String、StringBuffer 的区别
这是必问基础题。关键说清三点:
- String 不可变:每次拼接都新建对象,大量操作时内存和性能开销大
- StringBuffer 线程安全:方法加了 synchronized,适合多线程环境,但单线程下有同步开销
- StringBuilder 非线程安全:无同步机制,单线程下性能最优,是日常字符串拼接的首选
一句话总结:String 用于不变文本,StringBuffer 用于多线程拼接,StringBuilder 用于单线程高频拼接。
为什么 StringBuilder 比 String 拼接快?底层怎么实现的?
重点讲清“可变字符数组”和“扩容机制”:
立即学习“Java免费学习笔记(深入)”;
- 内部用 char[] 存储数据,默认初始容量为 16
- append() 直接在数组末尾写入,不创建新对象
- 当数组不够用时,触发扩容:新容量 = 旧容量 * 2 + 2(JDK 11+ 是 *2)
- 扩容需数组复制(System.arraycopy),所以提前预估容量能避免多次扩容
举例:拼接 1000 个字符串,若 StringBuilder 初始容量设为 8192,基本一次到位;默认 16 容量可能扩容 7~8 次,影响性能。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
常见陷阱与正确用法
面试官常通过代码片段考察细节理解:
- 不要在循环外反复 new StringBuilder:如果循环内每次都 new,等于没省对象创建开销;应复用实例(注意线程安全边界)
- toString() 返回的是新 String 对象,不是引用:StringBuilder 内容改变后,之前 toString() 得到的 String 不会变
- 注意 null 处理:append(null) 会写入字符串 "null",不是空指针异常;如需判空,自己加 if
- 链式调用是 OK 的:因为 append() 返回 this,可连写 sb.append("a").append(1).append(true)
一道典型编码题(带分析)
题目:实现一个方法,把字符串数组用指定分隔符拼成字符串,要求高效且不依赖 Arrays.toString 或 String.join(JDK 8+)。
参考写法:
public static String join(String[] strs, String delimiter) {
if (strs == null || strs.length == 0) return "";
if (strs.length == 1) return strs[0];
<pre class="brush:php;toolbar:false;">// 预估容量:所有字符串长度 + 分隔符总长度(比实际略大也没关系)
int len = 0;
for (String s : strs) len += (s != null ? s.length() : 4); // null 算 4 字节 "null"
len += (strs.length - 1) * (delimiter != null ? delimiter.length() : 0);
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < strs.length; i++) {
if (i > 0 && delimiter != null) sb.append(delimiter);
sb.append(strs[i]); // append(null) → "null"
}
return sb.toString();}
这道题考察点:容量预估意识、null 安全、append 链式逻辑、toString 时机,以及对 StringBuilder 生命周期的掌控。

















