最高效方式是单次遍历字符串,用多个int计数器分别统计字母、数字、空格、标点及其他字符,时间复杂度O(n),空间复杂度O(1)。

直接遍历字符串一次,用几个计数器分别统计不同字符类型,时间复杂度 O(n),空间 O(1),是最高效的方式。
明确分类并初始化计数器
先确定要统计的字符类别,常见如:字母(大小写可合并或分开)、数字、空格、标点符号、其他 Unicode 字符。为每类声明一个 int 变量,避免频繁装箱或使用 Map 带来额外开销。
例如:
- letterCount 统计 a–z 和 A–Z
- digitCount 统计 0–9
- spaceCount 统计 ' '
- punctCount 统计常见标点(如 !, ?, ., ,, ;, :, ', ", (, ), [, ], {, }, -, _ 等)
- otherCount 捕获其余未覆盖的字符(如中文、emoji、控制符等)
用 charAt() 遍历,避免创建中间对象
用 for (int i = 0; i 配合 str.charAt(i) 获取每个字符。不要用 str.toCharArray() 转数组——这会额外分配内存;也不要转成 Stream 或用正则匹配——它们有明显性能开销且不必要。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
判断时优先用 Character.isLetter(c)、Character.isDigit(c) 等标准方法,它们内部优化良好,支持 Unicode,比手写范围判断(如 c >= 'a' && c
标点和特殊字符建议用 Set 预定义(可选优化)
如果标点符号集合固定且不多(比如只关心 ASCII 标点),可提前用 Set
示例精简判断逻辑:
<font size="2">char c = str.charAt(i);
if (Character.isLetter(c)) {
letterCount++;
} else if (Character.isDigit(c)) {
digitCount++;
} else if (c == ' ') {
spaceCount++;
} else if (".!,;:?'\"()-_[]{}".indexOf(c) >= 0) {
punctCount++;
} else {
otherCount++;
}</font>
注意边界与编码无关性
Java String 默认基于 UTF-16,charAt() 对基本平面字符(如英文字母、数字、常用标点、中文汉字)完全可靠。遇到增补字符(如某些 emoji),需用 codePointAt() + Character.charCount() 跳过代理对——但绝大多数业务场景无需考虑,除非明确处理 emoji 或生僻 Unicode。
若需完整 Unicode 支持,可改用 str.codePoints().forEach(...) 流式处理,但性能略低;日常统计字母数字空格,传统 for + charAt 已足够高效且简洁。

















