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,可以在构造方法中指定。

📖 小节

📝 作业

  1. 字符串拼接: 用StringBuilder拼接1到100的数字,用逗号分隔
  2. HTML构建: 用StringBuilder构建一个无序列表(ul/li)
  3. 性能测试: 对比String和StringBuilder拼接10000次的时间差异

下一课

下一课我们将学习 数学与日期,了解Math类和日期时间API。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏