方法定义

public synchronized char charAt(int index)
  • 参数index - 要返回的字符索引(从0开始)
  • 返回值:指定索引位置的 char
  • 异常
    • IndexOutOfBoundsException:索引超出范围(index < 0 || index ≥ length()
  • 线程安全:使用 synchronized 修饰(多线程安全)

功能说明

返回 StringBuffer指定索引位置的字符。索引范围从 0(第一个字符)到 length()-1(最后一个字符)。


示例代码

StringBuffer sb = new StringBuffer("DeepSeek");

// 获取特定位置字符
char firstChar = sb.charAt(0);     // 'D'
char fifthChar = sb.charAt(4);     // 'S'

System.out.println("First character: " + firstChar);
System.out.println("Fifth character: " + fifthChar);

// 遍历所有字符
System.out.print("Characters: ");
for (int i = 0; i < sb.length(); i++) {
    System.out.print(sb.charAt(i) + " "); 
}
// 输出: D e e p S e e k

使用技巧

  1. 安全边界检查
    int index = 8;
    if (index >= 0 && index < sb.length()) {
        char c = sb.charAt(index);
    } else {
        // 处理越界情况
    }
    
  2. 反向遍历
    for (int i = sb.length() - 1; i >= 0; i--) {
        System.out.print(sb.charAt(i)); // 输出: keeSpecD
    }
    

常见错误

  1. 索引越界(最常见错误):
    StringBuffer sb = new StringBuffer("Hi");
    char c = sb.charAt(2); // 抛出IndexOutOfBoundsException
    
  2. 负数索引
    char c = sb.charAt(-1); // 必然抛出异常
    

注意事项

  1. 索引有效性:始终检查索引是否在 [0, length()-1] 范围内
  2. 空缓冲区
    StringBuffer sb = new StringBuffer();
    char c = sb.charAt(0); // length()=0,必定越界
    
  3. Unicode支持:正确处理基本多语言平面(BMP)外的字符(代理对)
    StringBuffer sb = new StringBuffer("🚀");
    char first = sb.charAt(0); // '\uD83D' (高位代理)
    char second = sb.charAt(1); // '\uDE80' (低位代理)
    

性能优化

  1. 避免重复调用:在循环中缓存长度值
    int len = sb.length(); // 避免每次循环调用length()
    for (int i = 0; i < len; i++) {
        sb.charAt(i);
    }
    
  2. 单线程环境:使用 StringBuilder.charAt()(无同步开销,性能提升5-10%)
    StringBuilder sb = new StringBuilder("Text");
    char c = sb.charAt(0); // 非同步方法
    

总结

要点 说明
核心功能 获取字符串缓冲区中任意位置的字符
时间复杂度 O(1) - 直接通过数组索引访问
线程安全 StringBuffer.charAt() 同步安全 vs StringBuilder.charAt() 非同步
关键风险 索引越界(必须严格检查 0 ≤ index < length()
最佳实践 循环遍历时缓存长度值 + 单线程用StringBuilder

使用场景推荐

  1. 随机访问特定位置字符
  2. 字符串遍历/分析
  3. 实现自定义字符串处理逻辑(如解析器、校验器等)

📌 黄金法则
使用 charAt() 前始终验证索引范围!
单线程场景优先选 StringBuilder.charAt() 提升性能!