Java 零基础教程

Java StringBuilder 类

Java 中的 StringBuilder 类旨在高效处理字符串修改。与不可变的 String 类(创建后值无法更改)不同,StringBuilder 允许你直接修改字符序列,而无需每次都创建新对象。

这在执行大量字符串操作时非常有用,因为它能显著减少内存开销,从而提升性能。StringBuilder 提供了一个可变的字符序列,并包含追加、插入、删除和替换字符的方法。掌握 StringBuilder 是编写高效 Java 代码的关键。

1. 理解 StringBuilder 类

StringBuilder 类属于 java.lang 包,这意味着你可以在程序中直接使用它,无需显式导入。它本质上代表了一个可变的字符序列。

1.1 String 的不可变性 vs StringBuilder 的可变性

这是两者之间最核心的区别:

  • String:对象是不可变的。每次你修改 String(如连接、截取),都会创建一个全新的 String 对象。
String str = "Hello";
str = str + " World"; // 创建了一个新的 String 对象
str = str.replace("World", "Java"); // 又创建了一个新的 String 对象
System.out.println(str); // 输出: Hello Java

在上面的例子中,实际上创建了三个对象:"Hello""Hello World""Hello Java"

  • StringBuilder:对象是可变的。修改直接作用于底层的字符序列,不会产生多余的对象。
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 直接修改原始的 StringBuilder 对象
sb.replace(6, 11, "Java"); // 还是修改同一个对象
System.out.println(sb); // 输出: HelloJava

这种方式在处理循环拼接或频繁修改时效率极高。

2. 创建 StringBuilder 对象

你可以通过以下几种方式创建 StringBuilder

1. 空对象:创建一个默认容量(通常为 16 个字符)的实例。

StringBuilder sb1 = new StringBuilder();
System.out.println(sb1.capacity()); // 输出: 16

2. 指定初始容量:如果你预知字符串会很长,可以指定大小以减少自动扩容的开销。

StringBuilder sb2 = new StringBuilder(50);

3. 指定初始内容:根据现有字符串创建,容量通常为字符串长度加 16。

StringBuilder sb3 = new StringBuilder("Initial Text");

3. StringBuilder 常用方法

StringBuilder 提供了丰富的方法来操作文本:

  • append():在末尾追加字符串或其他数据类型。
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World").append(123); // 支持链式调用
  • insert():在指定索引位置插入内容。
sb.insert(5, ", Java"); // "Hello, Java World"
  • replace():替换指定范围内的字符序列。
sb.replace(6, 11, "Java");
  • delete() 和 deleteCharAt():删除一段范围或单个字符。
sb.delete(5, 11); // 删除索引 5 到 11 的内容
sb.deleteCharAt(4); // 删除索引 4 的字符
  • reverse():反转整个字符序列。
sb.reverse(); // "olleH"
  • length() 与 capacity()
    • length() 返回实际字符数。
    • capacity() 返回当前分配的存储空间大小。

4. StringBuilder vs StringBuffer

Java 还有一个类似的类叫 StringBuffer。它们的功能几乎一致,主要区别在于:

  • StringBuffer:线程安全(同步)。适用于多线程环境,但由于同步开销,在单线程中速度较慢。
  • StringBuilder:非线程安全。在单线程环境下性能更好,是大多数场景的首选。

5. 实践案例

5.1 构建逗号分隔的列表

String[] items = {"Apple", "Banana", "Orange"};
StringBuilder sb = new StringBuilder();
for (int i = 0; i < items.length; i++) {
    sb.append(items[i]);
    if (i < items.length - 1) {
        sb.append(", ");
    }
}
System.out.println(sb.toString()); // 输出: Apple, Banana, Orange

5.2 生成 HTML 表格行

String[] rowData = {"张三", "30", "北京"};
StringBuilder tableRow = new StringBuilder();
tableRow.append("<tr>");
for (String data : rowData) {
    tableRow.append("<td>").append(data).append("</td>");
}
tableRow.append("</tr>");

6. 最佳实践

  1. 循环中必用 StringBuilder:永远不要在 forwhile 循环中使用 String+ 拼接,这会产生大量临时对象。
  2. 预设容量:如果知道最终字符串大约有 1000 字符,初始化时直接 new StringBuilder(1000) 可以避免多次内存重分配。
  3. 链式编程:利用方法返回自身的特性,让代码更简洁:sb.append("a").append("b").reverse();