Skip to content

StringBuilder


一、是什么?

StringBuilder 是 Java 中用于高效操作可变字符串的类(位于 java.lang 包)。与不可变的 String 不同,它允许直接修改字符串内容(如追加、插入、删除),避免了频繁创建新对象的开销。JDK 5+ 引入,非线程安全(与之对应的是线程安全的 StringBuffer)。

二、解决什么问题

  1. 性能问题:频繁拼接 String 会产生大量中间对象(如 str1 + str2 实际生成新对象),内存和性能开销大。
  2. 高效修改:直接修改字符序列,无需反复创建新字符串。
  3. 代码简洁性:链式调用(如 .append().insert())简化代码。

三、核心方法

方法作用
append(String s)追加内容(支持多种数据类型)
insert(int offset, String s)在指定位置插入内容
delete(int start, int end)删除子串
reverse()反转字符串
toString()转为不可变 String
setCharAt(int index, char c)替换指定位置的字符

四、应用场景

  1. 循环拼接字符串(如构建 SQL 语句、JSON 等)。
  2. 动态生成字符串(如日志拼接、文件路径组装)。
  3. 算法题高频场景
    • 字符串反转(reverse()
    • 回文判断(append() + reverse() 对比)
    • 大文本处理(避免 + 导致的 O(n²) 时间复杂度)
  4. 替换频繁修改的 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!

六、重要注意事项

  1. 非线程安全:多线程环境用 StringBuffer(但代码题通常单线程)。
  2. 初始化容量:默认容量 16 字符,超时自动扩容。预估大小时可指定初始容量(如 new StringBuilder(100))减少扩容次数。
  3. 复用对象:避免循环内重复 new StringBuilder(),应在循环外创建。
  4. String 转换:最终输出需调用 toString()
  5. JDK 9+ 优化:底层改用 byte[] 存储,减少小字符串内存占用。

七、总结

StringBuilder 是解决字符串高效修改的核心工具,在代码题中优先用于所有频繁修改字符串的场景,尤其循环拼接、反转、动态构建等操作。相比 String+ 操作,它能将时间复杂度从 O(n²) 降至 O(n),显著提升性能。


Mermaid 图示:StringBuilder vs String 操作对比