用HashMap统计字符频次:以Character为key、Integer为value,遍历字符串,用map.put(c, map.getOrDefault(c, 0) + 1)高效更新;支持大小写敏感/忽略、Unicode排序(TreeMap)、格式化输出,注意null字符和线程安全。

用 HashMap 统计字符串中每个字符出现的次数,核心思路是:把字符当作 键(key),把出现次数当作 值(value)。每次遍历到一个字符,就查它在 map 中是否存在;不存在就设为 1,存在就把原值加 1。
基本步骤说明
整个过程逻辑清晰、代码简洁,关键在于理解 HashMap 的“键唯一性”和“自动覆盖”特性:
- 创建
HashMap<character integer></character>,注意用包装类Character和Integer,不能用基本类型 - 用
charAt(i)或toCharArray()遍历字符串,逐个取字符 - 对每个字符
c,调用map.get(c):返回null表示首次出现,否则拿到当前计数 - 用
map.put(c, newValue)更新或插入——相同 key 会自动覆盖旧 value
推荐写法:一行条件赋值(简洁安全)
避免先 get 再判空再 put 的三步操作,直接用三元运算符更新更高效:
map.put(c, map.getOrDefault(c, 0) + 1);
其中 getOrDefault(c, 0) 是 Java 8+ 提供的方法,比手动判 null 更简洁、线程安全、不易出错。
立即学习“Java免费学习笔记(深入)”;
输出结果的几种方式
统计完后,按需选择遍历方式:
-
按输入顺序乱序输出:直接遍历
keySet(),例如for (Character c : map.keySet()) -
按字符 Unicode 升序输出:把
HashMap换成TreeMap<character integer></character>,它会自动排序 -
格式化拼接输出:用
StringBuilder拼成a(3)b(1)c(2)这类紧凑字符串,适合日志或接口返回
注意事项
实际编码中容易忽略但影响结果的细节:
- 区分大小写:
'A'和'a'是两个不同 key,如需忽略,提前统一转toLowerCase() - 空格、换行、标点、汉字都算有效字符,也会被统计,无需额外过滤(除非业务明确要求)
- 如果字符串含 null 字符(
'\u0000'),也能正常统计,HashMap 支持 null key(但不建议主动用) - 多线程环境下要改用
ConcurrentHashMap,否则可能产生并发修改异常


















