StringBuilder
一、是什么?
StringBuilder
是 Java 中用于高效操作可变字符串的类(位于 java.lang
包)。与不可变的 String
不同,它允许直接修改字符串内容(如追加、插入、删除),避免了频繁创建新对象的开销。JDK 5+ 引入,非线程安全(与之对应的是线程安全的 StringBuffer
)。
二、解决什么问题
- 性能问题:频繁拼接
String
会产生大量中间对象(如str1 + str2
实际生成新对象),内存和性能开销大。 - 高效修改:直接修改字符序列,无需反复创建新字符串。
- 代码简洁性:链式调用(如
.append().insert()
)简化代码。
三、核心方法
方法 | 作用 |
---|---|
append(String s) | 追加内容(支持多种数据类型) |
insert(int offset, String s) | 在指定位置插入内容 |
delete(int start, int end) | 删除子串 |
reverse() | 反转字符串 |
toString() | 转为不可变 String |
setCharAt(int index, char c) | 替换指定位置的字符 |
四、应用场景
- 循环拼接字符串(如构建 SQL 语句、JSON 等)。
- 动态生成字符串(如日志拼接、文件路径组装)。
- 算法题高频场景:
- 字符串反转(
reverse()
) - 回文判断(
append()
+reverse()
对比) - 大文本处理(避免
+
导致的 O(n²) 时间复杂度)
- 字符串反转(
- 替换频繁修改的
String
(尤其 JDK 8+ 后编译器不会自动优化循环内的+
操作)。
五、Java示例
java
// 1. 基础拼接
StringBuilder sb = new StringBuilder();
sb.append("Hello").append(", ").append("World!"); // 链式调用
System.out.println(sb.toString()); // 输出: Hello, World!
// 2. 算法题示例:反转字符串
String input = "algorithm";
String reversed = new StringBuilder(input).reverse().toString();
System.out.println(reversed); // 输出: mhtirogla
// 3. 动态修改
sb.insert(5, " Java"); // 在索引5插入
System.out.println(sb); // 输出: Hello Java, World!
sb.delete(5, 10); // 删除索引5-10
System.out.println(sb); // 输出: Hello, World!
六、重要注意事项
- 非线程安全:多线程环境用
StringBuffer
(但代码题通常单线程)。 - 初始化容量:默认容量 16 字符,超时自动扩容。预估大小时可指定初始容量(如
new StringBuilder(100)
)减少扩容次数。 - 复用对象:避免循环内重复
new StringBuilder()
,应在循环外创建。 - 与
String
转换:最终输出需调用toString()
。 - JDK 9+ 优化:底层改用
byte[]
存储,减少小字符串内存占用。
七、总结
StringBuilder
是解决字符串高效修改的核心工具,在代码题中优先用于所有频繁修改字符串的场景,尤其循环拼接、反转、动态构建等操作。相比 String
的 +
操作,它能将时间复杂度从 O(n²) 降至 O(n),显著提升性能。