方法定义
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
使用技巧
- 安全边界检查:
int index = 8; if (index >= 0 && index < sb.length()) { char c = sb.charAt(index); } else { // 处理越界情况 }
- 反向遍历:
for (int i = sb.length() - 1; i >= 0; i--) { System.out.print(sb.charAt(i)); // 输出: keeSpecD }
常见错误
- 索引越界(最常见错误):
StringBuffer sb = new StringBuffer("Hi"); char c = sb.charAt(2); // 抛出IndexOutOfBoundsException
- 负数索引:
char c = sb.charAt(-1); // 必然抛出异常
注意事项
- 索引有效性:始终检查索引是否在
[0, length()-1]
范围内 - 空缓冲区:
StringBuffer sb = new StringBuffer(); char c = sb.charAt(0); // length()=0,必定越界
- Unicode支持:正确处理基本多语言平面(BMP)外的字符(代理对)
StringBuffer sb = new StringBuffer("🚀"); char first = sb.charAt(0); // '\uD83D' (高位代理) char second = sb.charAt(1); // '\uDE80' (低位代理)
性能优化
- 避免重复调用:在循环中缓存长度值
int len = sb.length(); // 避免每次循环调用length() for (int i = 0; i < len; i++) { sb.charAt(i); }
- 单线程环境:使用
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 |
使用场景推荐:
- 随机访问特定位置字符
- 字符串遍历/分析
- 实现自定义字符串处理逻辑(如解析器、校验器等)
📌 黄金法则:
使用charAt()
前始终验证索引范围!
单线程场景优先选StringBuilder.charAt()
提升性能!