StringBuilder
StringBuilder是可变的字符序列,适合频繁修改字符串的场景。
为什么需要StringBuilder
String是不可变的,每次修改都会创建新对象,效率低。
示例:String vs StringBuilder
JAVA
// String拼接(低效)
String s = "";
for (int i = 0; i < 10000; i++) {
s += "a"; // 每次创建新对象
}
// StringBuilder拼接(高效)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append("a"); // 修改同一个对象
}
String result = sb.toString();
💡 性能差异: 循环拼接10000次,StringBuilder比String快100倍以上。
创建StringBuilder
JAVA
// 空的StringBuilder
StringBuilder sb1 = new StringBuilder();
// 初始容量
StringBuilder sb2 = new StringBuilder(100);
// 初始内容
StringBuilder sb3 = new StringBuilder("Hello");
常用方法
append():追加
JAVA
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
sb.append(123);
System.out.println(sb); // HelloWorld123
insert():插入
JAVA
StringBuilder sb = new StringBuilder("Hello");
sb.insert(5, " World");
System.out.println(sb); // Hello World
delete():删除
JAVA
StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 6); // 删除索引5的字符(空格)
System.out.println(sb); // HelloWorld
replace():替换
JAVA
StringBuilder sb = new StringBuilder("Hello World");
sb.replace(6, 11, "Java");
System.out.println(sb); // Hello Java
reverse():反转
JAVA
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb); // olleH
其他方法
| 方法 | 说明 | 示例 |
|---|---|---|
charAt() |
获取指定位置字符 | sb.charAt(0) |
length() |
当前长度 | sb.length() |
capacity() |
当前容量 | sb.capacity() |
setCharAt() |
设置指定位置字符 | sb.setCharAt(0,'h') |
substring() |
截取子串 | sb.substring(0,3) |
链式调用
StringBuilder的方法返回this,支持链式调用。
JAVA
String result = new StringBuilder()
.append("Hello")
.append(" ")
.append("World")
.append("!")
.toString();
System.out.println(result); // Hello World!
示例:构建SQL语句
JAVA
public class SqlBuilder {
public static String buildSelect(String table, String[] columns, String where) {
StringBuilder sql = new StringBuilder("SELECT ");
// 列名
sql.append(String.join(", ", columns));
sql.append(" FROM ");
sql.append(table);
// 条件
if (where != null && !where.isEmpty()) {
sql.append(" WHERE ");
sql.append(where);
}
return sql.toString();
}
public static void main(String[] args) {
String sql = buildSelect("users",
new String[]{"id", "name", "email"},
"age > 18");
System.out.println(sql);
// SELECT id, name, email FROM users WHERE age > 18
}
}
示例:构建HTML
JAVA
public class HtmlBuilder {
public static String buildTable(String[][] data) {
StringBuilder html = new StringBuilder();
html.append("<table>\n");
for (String[] row : data) {
html.append(" <tr>\n");
for (String cell : row) {
html.append(" <td>").append(cell).append("</td>\n");
}
html.append(" </tr>\n");
}
html.append("</table>");
return html.toString();
}
public static void main(String[] args) {
String[][] data = {
{"Alice", "25", "Engineer"},
{"Bob", "30", "Designer"}
};
System.out.println(buildTable(data));
}
}
StringBuilder vs StringBuffer
| 特性 | StringBuilder | StringBuffer |
|---|---|---|
| 线程安全 | 否 | 是 |
| 性能 | 更快 | 较慢 |
| 使用场景 | 单线程 | 多线程 |
💡 建议: 单线程用StringBuilder,多线程用StringBuffer。一般情况下用StringBuilder。
容量与扩容
StringBuilder有容量概念,超出时自动扩容。
JAVA
StringBuilder sb = new StringBuilder();
System.out.println("初始容量:" + sb.capacity()); // 16
// 追加内容,超过容量时扩容
for (int i = 0; i < 20; i++) {
sb.append("a");
}
System.out.println("当前容量:" + sb.capacity()); // 34
System.out.println("当前长度:" + sb.length()); // 20
💡 扩容规则: 新容量 = 旧容量 * 2 + 2
❓ 常见问题
Q 什么时候用StringBuilder?
A 需要频繁修改字符串时,如循环拼接、构建复杂字符串。
Q StringBuilder和String怎么选?
A 少量操作用String(简洁),大量操作用StringBuilder(高效)。
Q StringBuilder的默认容量是多少?
A 默认16,可以在构造方法中指定。
📖 小节
- StringBuilder是可变的字符序列,适合频繁修改
- 常用方法:append/insert/delete/replace/reverse
- 支持链式调用
- 单线程用StringBuilder,多线程用StringBuffer
- 默认容量16,超出时自动扩容
📝 作业
- 字符串拼接: 用StringBuilder拼接1到100的数字,用逗号分隔
- HTML构建: 用StringBuilder构建一个无序列表(ul/li)
- 性能测试: 对比String和StringBuilder拼接10000次的时间差异
下一课
下一课我们将学习 数学与日期,了解Math类和日期时间API。



