stringbuilder 的 codepointcount(int beginindex, int endindex) 方法统计指定范围内 unicode 码点数,正确处理代理对,而 length() 仅返回 char 数组长度,对 emoji 等补充字符会高估;调用时需满足 0 ≤ beginindex ≤ endindex ≤ length(),推荐用 sb.codepointcount(0, sb.length()) 获取真实字符数。

Java 中 StringBuilder 的 codePointCount(int beginIndex, int endIndex) 方法,是用来统计指定范围内 **Unicode 码点(code point)的个数**,而非 char 数组长度。它能正确处理 Unicode 补充字符(即需要两个 char 表示的代理对,surrogate pair),从而得到人眼可见的“真实字符数”。
为什么不能直接用 length()?
length() 返回的是内部 char 数组的长度,而一个 emoji 或古汉字(如 ?、?)可能占用 2 个 char(即一个代理对),但只算作 1 个逻辑字符(1 个码点)。此时 length() 会高估,codePointCount() 才准确。
如何正确调用 codePointCount
该方法签名是:int codePointCount(int beginIndex, int endIndex),注意:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 索引范围是左闭右开:包含
beginIndex,不包含endIndex - 两个索引必须满足
0 ≤ beginIndex ≤ endIndex ≤ length() - 底层会自动识别并跳过代理对,把每个完整码点计为 1
典型使用示例
比如构建含 emoji 和中文的字符串:
StringBuilder sb = new StringBuilder("a\uD83D\uDC31b"); // "a" + ? + "b"
System.out.println(sb.length()); // 输出 4('a' + 高代理 + 低代理 + 'b')
System.out.println(sb.codePointCount(0, sb.length())); // 输出 3(a、?、b 各 1 个码点)
再比如统计前 2 个码点:
-
sb.codePointCount(0, 2)→ 若前两个码点是 "a" 和 ?,结果为 2 - 注意:不能传
sb.codePointCount(0, 3)来“取前 3 个 char”,因为endIndex=3可能切在代理对中间,抛IndexOutOfBoundsException
安全获取全部码点数的推荐写法
要统计整个 StringBuilder 的真实字符数,统一用:
-
sb.codePointCount(0, sb.length())—— 最稳妥 - 避免手动计算或遍历
codePointAt(),除非需逐个处理码点 - 若需遍历所有码点,用
for (int i = 0; i
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










