方法定义

// 基础定义
public StringBuilder append(数据类型 param)

// 支持的数据类型:
// - 基本类型:int, long, float, double, boolean, char
// - 引用类型:String, Object(调用toString())
// - 字符数组:char[], CharSequence, StringBuffer

核心功能说明

  1. 追加内容
    将指定数据转换为字符串后追加到字符序列末尾
  2. 链式调用
    返回StringBuilder对象本身,支持连续操作
  3. 自动扩容
    容量不足时自动扩容(newCapacity = (oldCapacity << 1) + 2
  4. 空值处理
    append(null) 会追加字符串 "null"

操作步骤详解

1. 基本使用

StringBuilder sb = new StringBuilder("Start: ");
sb.append(100);        // 追加整数 → "Start: 100"
sb.append(true);       // 追加布尔 → "Start: 100true"
sb.append(3.14);       // 追加浮点 → "Start: 100true3.14"

2. 链式调用

String result = new StringBuilder()
    .append("Name: ").append(user.getName())
    .append(", Age: ").append(user.getAge())
    .append(", Active: ").append(user.isActive())
    .toString();  // 转换为String

3. 特殊类型处理

char[] chars = {'J','a','v','a'};
sb.append(chars, 1, 3);  // 追加字符子数组 → "ava"

Object obj = new Object();
sb.append(obj);  // 调用obj.toString()

使用技巧

  1. 链式优化
    单行完成复杂拼接,减少临时变量

    // 优于多行独立append
    sb.append(a).append(b).append(c);
    
  2. 避免中间转换
    延迟toString()直到最终需要

    // 错误:频繁转换
    String temp = sb.append(a).toString();
    temp += b;
    
    // 正确:统一构建
    sb.append(a).append(b);
    
  3. 数值格式化

    sb.append(String.format("%.2f", 3.14159));  // 追加"3.14"
    

常见错误

  1. 意外修改共享对象

    StringBuilder sharedSB = getSharedBuilder();
    sharedSB.append(userInput); // 可能破坏其他逻辑
    
  2. 循环中重复创建

    for (int i = 0; i < 1000; i++) {
        StringBuilder sb = new StringBuilder(); // 应移出循环!
        sb.append(i);
    }
    
  3. 忽略返回值

    StringBuilder sb = new StringBuilder();
    sb.append("A");     // 返回值被忽略
    sb = sb.append("B"); // 不必要的重新赋值
    

关键注意事项

  1. 空值行为

    sb.append(null);  // 追加"null"字符串
    
  2. 容量管理

    • 默认初始容量:16字符
    • 扩容代价:数组拷贝(O(n)时间)
    • 容量检查:ensureCapacity(int)
  3. 字符编码
    所有追加操作使用平台默认编码(通常UTF-8)


性能优化

  1. 预分配容量(避免扩容)

    // 已知最终长度约1200字符
    StringBuilder sb = new StringBuilder(1500); // +25%缓冲
    
  2. 批量操作

    char[] bigData = new char[10000];
    // 优于多次append
    sb.append(bigData); 
    
  3. 复用实例

    StringBuilder reusable = new StringBuilder(1024);
    for (Request req : requests) {
        reusable.setLength(0); // 清空内容
        reusable.append(req.process());
        send(reusable.toString());
    }
    

最佳实践

场景 推荐方案
小型固定拼接(<5次) String+运算符
循环内拼接 StringBuilder预分配容量
多线程环境 StringBuffer.append()
大数据追加(>10KB) 预分配容量+批量操作
临时字符串处理 复用StringBuilder实例

性能对比

// 测试代码(追加100,000次)
void testAppend() {
    // 方案1:String拼接
    String s = "";
    long t1 = System.nanoTime();
    for (int i = 0; i < 100_000; i++) {
        s += i;
    }
    
    // 方案2:无预分配StringBuilder
    StringBuilder sb1 = new StringBuilder();
    long t2 = System.nanoTime();
    for (int i = 0; i < 100_000; i++) {
        sb1.append(i);
    }
    
    // 方案3:预分配StringBuilder
    StringBuilder sb2 = new StringBuilder(200_000);
    long t3 = System.nanoTime();
    for (int i = 0; i < 100_000; i++) {
        sb2.append(i);
    }
    
    System.out.printf("String拼接: %d ms%n", (t2-t1)/1_000_000);
    System.out.printf("StringBuilder无预分配: %d ms%n", (t3-t2)/1_000_000);
    System.out.printf("StringBuilder预分配: %d ms%n", (System.nanoTime()-t3)/1_000_000);
}

典型结果(JDK 17, 8核CPU):

String拼接: 4523 ms
StringBuilder无预分配: 12 ms
StringBuilder预分配: 8 ms

终极总结

  1. 核心价值

    • 解决String频繁修改的性能问题
    • 链式调用简化代码
    • 可控的内存管理
  2. 使用原则

    graph TD
    A[需要拼接字符串?] --> B{操作次数}
    B -->|<=3次| C[String + 运算符]
    B -->|>3次| D{是否在循环中?}
    D -->|是| E[StringBuilder预分配容量]
    D -->|否| F[StringBuilder链式调用]
    
  3. 黄金法则

    • ✅ 循环内必用StringBuilder
    • ✅ 预分配容量提升10倍性能
    • ❌ 避免中间toString()转换
    • ❌ 多线程环境改用StringBuffer
  4. 异常处理

    • 捕获OutOfMemoryError(超大字符串)
    • 检查NullPointerException(未初始化)

掌握这些要点,你将在字符串处理中游刃有余,轻松应对从简单日志到大数据处理的各类场景!