0Pricing
Java Academy · 课时

使用 StringBuilder 高效拼接

在循环和复杂格式化过程中使用 StringBuilder 高效构建字符串

使用 StringBuilder 高效拼接 是 CoddyKit 上的免费 Java Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

使用 StringBuilder 高效拼接

StringBuilder 是用于逐步构建文本的可变替代方案。它可以避免创建大量中间 String 对象。

StringBuilder 与 String 拼接

拼接许多字符串时(尤其是在循环中),StringBuilder 的速度会快得多,因为它会修改内部的字符缓冲区,而不是不断创建新对象。

// Inefficient: creates a new String every iteration
String result = "";
for (int i = 0; i < 1000; i++) {
    result += i + ","; // 1000 new String objects!
}

// Efficient: StringBuilder uses a resizable char buffer
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i).append(',');
}
String efficient = sb.toString(); // one final String created

StringBuilder 接口

主要方法:append、insert、delete、replace、reverse、toString、length、charAt、setCharAt。

StringBuilder sb = new StringBuilder("Hello");

sb.append(", World");     // Hello, World
sb.insert(5, "!");        // Hello!, World
sb.delete(5, 6);           // Hello, World
sb.replace(7, 12, "Java"); // Hello, Java
sb.reverse();               // avaJ ,olleH
sb.reverse();               // Hello, Java

System.out.println(sb);         // Hello, Java
System.out.println(sb.length()); // 11
System.out.println(sb.charAt(0)); // H

链式调用 append

所有 append 方法和其他修改方法都会返回 this,因此可以进行流式链式调用。

StringBuilder html = new StringBuilder()
    .append("<div class=\"card\">")
    .append("<h2>").append("Product Title").append("</h2>")
    .append("<p>Price: $").append(String.format("%.2f", 29.99)).append("</p>")
    .append("<button>Add to Cart</button>")
    .append("</div>");

System.out.println(html.toString());

初始容量

请根据预期容量预先设置 StringBuilder 的大小,以避免内部数组扩容,从而提升处理大字符串时的性能。

// Default capacity: 16 chars
StringBuilder small = new StringBuilder();

// Pre-sized: 10 items * ~50 chars each
StringBuilder report = new StringBuilder(500);

for (int i = 1; i <= 10; i++) {
    report.append(String.format("%-3d. Record %04d: processed OK%n", i, i));
}

System.out.println(report.toString().substring(0, 30));
// "  1. Record 0001: processed OK"

deleteCharAt 与指定位置删除

deleteCharAt 会删除单个字符。delete(start, end) 会删除一个范围内的内容。由于需要移动数组元素,这些操作的复杂度为 O(n)。

StringBuilder sb = new StringBuilder("Hello, World!");

sb.deleteCharAt(5);     // removes comma: "Hello World!"
sb.delete(5, 6);         // removes space: "HelloWorld!"

System.out.println(sb); // HelloWorld!

// Replace to fix a typo
StringBuilder typo = new StringBuilder("Helo, Java!");
typo.replace(typo.indexOf("Helo"), typo.indexOf("Helo") + 4, "Hello");
System.out.println(typo); // Hello, Java!

构建 CSV

一种实用模式是:使用 StringBuilder 构建 CSV 行,并正确处理分隔符。

import java.util.List;

static String toCsv(List<String> values) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < values.size(); i++) {
        if (i > 0) sb.append(',');
        sb.append(escapeCsv(values.get(i)));
    }
    return sb.toString();
}

static String escapeCsv(String s) {
    if (s.contains(",") || s.contains("\""))
        return "\"" + s.replace("\"", "\"\"") + "\"";
    return s;
}

System.out.println(toCsv(List.of("Alice", "Smith, Jr.", "30")));
// Alice,"Smith, Jr.",30

使用 StringJoiner 生成分隔符分隔的输出

StringJoiner 可以简化使用分隔符连接元素的操作,并支持可选的前缀和后缀,因此无需手动处理分隔符。

import java.util.StringJoiner;

StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.add("Alice");
sj.add("Bob");
sj.add("Charlie");
System.out.println(sj.toString()); // [Alice, Bob, Charlie]

// Equivalent with String.join
String joined = String.join(", ", "Alice", "Bob", "Charlie");
System.out.println(joined); // Alice, Bob, Charlie

// Streams: collect with joining collector
import java.util.stream.*;
List.of("a", "b", "c").stream()
    .collect(Collectors.joining(", ", "(", ")"));
// (a, b, c)

StringBuilder 与 StringBuffer

StringBuffer 是 StringBuilder 的线程安全同步版本。由于需要加锁,它的速度较慢。在单线程场景中(占 99% 的情况),请使用 StringBuilder。

// StringBuffer: thread-safe but slower (synchronized methods)
StringBuffer buf = new StringBuffer();
buf.append("Thread-safe");
buf.append(" but slow");

// StringBuilder: not thread-safe but faster
StringBuilder sb = new StringBuilder();
sb.append("Fast");
sb.append(" single-threaded");

// When to use StringBuffer:
// - Multiple threads write to the same buffer
// - Almost always a design smell — redesign to avoid sharing

反转字符串与回文检查

StringBuilder 内置的 reverse() 方法可以让回文检查变得简洁优雅。

static boolean isPalindrome(String s) {
    String cleaned = s.toLowerCase()
        .replaceAll("[^a-z0-9]", ""); // remove non-alphanumeric
    String reversed = new StringBuilder(cleaned).reverse().toString();
    return cleaned.equals(reversed);
}

System.out.println(isPalindrome("A man, a plan, a canal: Panama")); // true
System.out.println(isPalindrome("race a car"));                      // false
System.out.println(isPalindrome("Was it a car or a cat I saw?"));    // true

实际应用:SQL 查询构建器

使用 StringBuilder 构建动态 SQL 查询,并根据条件添加查询子句。

static String buildQuery(String category, Double minPrice, Double maxPrice) {
    StringBuilder sql = new StringBuilder("SELECT * FROM products WHERE 1=1");
    if (category != null)
        sql.append(" AND category = '" + category + "'");
    if (minPrice != null)
        sql.append(" AND price >= ").append(minPrice);
    if (maxPrice != null)
        sql.append(" AND price <= ").append(maxPrice);
    sql.append(" ORDER BY name");
    return sql.toString();
}

System.out.println(buildQuery("Electronics", 50.0, null));
// SELECT * FROM products WHERE 1=1 AND category = 'Electronics' AND price >= 50.0 ORDER BY name

快速检查

为什么在循环中使用 + 进行字符串拼接效率很低?

回顾:使用 StringBuilder 高效拼接

要点:

  • StringBuilder 是可变的:append、insert、delete 会修改内部缓冲区
  • 请在循环中使用 StringBuilder,以避免创建字符串时产生 O(n²) 的开销
  • 所有修改方法都会返回自身,因此可以进行流式链式调用
  • 请根据预期容量预先设置 StringBuilder 的大小,以减少内部扩容
  • StringJoiner 和 String.join 便于生成使用分隔符分隔的输出
  • StringBuffer 是同步的(线程安全)但速度较慢的替代方案

常见问题解答

「使用 StringBuilder 高效拼接」课时是免费的吗?

是的 — 「使用 StringBuilder 高效拼接」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「使用 StringBuilder 高效拼接」这节课中我会学到什么?

在循环和复杂格式化过程中使用 StringBuilder 高效构建字符串 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「使用 StringBuilder 高效拼接」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. String 不可变性与字符串池
  2. 使用 StringBuilder 高效拼接
  3. 文本块与 String.format
  4. 使用 Pattern 和 Matcher 处理正则表达式
← 返回 Java Academy