StringBuilder 实现了 CharSequence 接口,JDK 9+ 中可直接调用 chars() 方法返回 IntStream,按 UTF-16 代码单元拆分字符,对非 BMP 字符需改用 codePoints();流为惰性只读快照,不复制数组且互不影响。

Java 的 StringBuilder 本身没有直接提供 chars() 方法(那是 String 和 CharSequence 的默认方法),但它实现了 CharSequence 接口,因此可以**直接调用 chars()** —— 无需额外转换或反射,也无需手动遍历。
确认 StringBuilder 实现了 CharSequence
StringBuilder 是 CharSequence 的子类型,JDK 9+ 中 CharSequence 接口新增了默认方法 chars() 和 codePoints(),返回 IntStream。只要你的项目使用 JDK 9 或更高版本,就可以直接用:
-
new StringBuilder("hello").chars()→IntStream(每个元素是char的 Unicode 码点,即int) - 结果流与
"hello".chars()行为完全一致,包括顺序、长度、空字符串处理等
注意字符编码与 surrogate pair
chars() 按 UTF-16 代码单元 拆分,不是按 Unicode 字符(code point)。对基本多文种平面(BMP)外的字符(如 ?、??),它会拆成两个 int(high/low surrogate),可能造成逻辑错误。
- 若需正确处理 emoji 或生僻汉字,改用
codePoints()(同样来自CharSequence) - 例如:
new StringBuilder("?").codePoints().count()返回 1;而.chars().count()返回 2
无缝接入 Stream 管道的典型用法
你可以像操作任何 IntStream 那样链式调用:过滤、映射、归约……
立即学习“Java免费学习笔记(深入)”;
- 统计小写字母个数:
sb.chars().filter(Character::isLowerCase).count() - 转成大写字符串:
String s = sb.chars().mapToObj(c -> (char) Character.toUpperCase(c)).map(String::valueOf).collect(Collectors.joining()) - 更高效写法(避免装箱):
String upper = sb.chars().mapToObj(c -> String.valueOf((char) Character.toUpperCase(c))).collect(Collectors.joining())
性能与注意事项
该方式不复制底层字符数组,chars() 返回的是基于当前 StringBuilder 内容的惰性流,但流一旦开始消费,后续修改 StringBuilder 不会影响已创建的流(因为流捕获的是当前快照)。
- 流是只读视图,不会改变原
StringBuilder - 多次调用
chars()会生成多个独立流,互不影响 - 如果
StringBuilder很大,chars()本身开销极小,但后续终端操作(如collect)可能有内存/时间成本


















