使用 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 createdStringBuilder 接口
主要方法: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 反馈 — 无需本地设置。
此课程中的所有课时
- String 不可变性与字符串池
- 使用 StringBuilder 高效拼接
- 文本块与 String.format
- 使用 Pattern 和 Matcher 处理正则表达式