stringbuilder的getchars方法提供零开销局部字符拷贝,通过void getchars(int srcbegin, int srcend, char[] dst, int dstbegin)将指定区间字符直接复制到目标数组,要求索引合法、目标数组非空且容量充足。

StringBuilder 的 getChars 方法能直接把指定区间的字符批量复制到目标 char 数组,不创建新对象、不额外装箱,是真正零开销的局部拷贝方式。
getChars 方法签名和参数含义
方法定义为:void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
- srcBegin:起始索引(包含),从 StringBuilder 内部字符数组的第几个位置开始取
- srcEnd:结束索引(不包含),复制到第 srcEnd - 1 位为止
- dst:目标 char 数组,必须已初始化且足够大
- dstBegin:在目标数组中写入的起始下标(从 dst[dstBegin] 开始填)
正确调用的关键细节
必须确保三件事同时成立,否则抛 IndexOutOfBoundsException:
- 0 ≤ srcBegin ≤ srcEnd ≤ length()(越界检查由内部完成)
- dst.length ≥ dstBegin + (srcEnd - srcBegin)(目标数组容量要够)
- dst != null(空数组引用会直接 NPE)
例如:sb.getChars(2, 5, buf, 0) 表示把 sb 第 2、3、4 位(共 3 个字符)复制到 buf[0]、buf[1]、buf[2]。
典型高效使用场景
适合替代 substring().toCharArray() 或循环 charAt(),尤其在高频或大数据量时优势明显:
- 解析协议字段:从长文本中快速提取固定偏移的字段,直接落进预分配缓冲区
- 批量写入 IO:把 StringBuilder 中某一段直接灌入 char[],再传给 Writer.write(char[], int, int)
- 避免临时对象:不用 new String(sb.substring(...)).toCharArray(),省掉 String 构造和 GC 压力
一个完整可运行例子
假设你要提取 “HelloWorld” 中 “ll” 并存入已有数组:
StringBuilder sb = new StringBuilder("HelloWorld");
char[] target = new char[2];
sb.getChars(2, 4, target, 0); // 复制索引 2~3('l','l')到 target[0] 和 target[1]
// target 现在是 ['l', 'l']
注意:索引 2 是 'l'(H-e-l-l-o...),srcEnd=4 表示取到但不含索引 4,正好两个字符。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











