Java统计单词频次推荐用正则分词+HashMap手动计数:以“W+”切分、转小写、用getOrDefault或merge更新计数;Stream方式适合链式处理;实际优先选第一种,清晰易调试。

Java 中统计文本中每个单词出现次数,核心是分词 + 计数,用 HashMap<String, Integer> 最直接。但要注意:光用 split(" ") 不够健壮,标点、大小写、空字符串都会影响结果。下面给出三种实用方式,从基础到推荐。
用正则分词 + HashMap 手动计数(最常用)
适合大多数场景,兼顾可读性和准确性。
- 用
split("[^a-zA-Z]+")或\W+按非字母字符切分,自动跳过标点和空格 - 对每个非空单词转小写(避免 "Hello" 和 "hello" 被算作两个词)
- 用
map.getOrDefault(word, 0) + 1更新计数,简洁安全
用 merge() 方法一行更新(更简洁)
避免重复写 get + put,逻辑更紧凑:
-
map.merge(word, 1, Integer::sum)—— 如果 key 存在,就用 sum 合并值;不存在就设为 1 - 不需要判空或初始化,代码少且线程安全(单次操作原子)
用 Stream API 函数式处理(适合链式操作)
适合已有字符串流或想结合过滤/排序的场景:
立即学习“Java免费学习笔记(深入)”;
- 先
Arrays.stream(text.split("\W+"))得到单词流 - 过滤空字符串:
.filter(word -> !word.isEmpty()) - 转小写 + 收集为 Map:
.collect(Collectors.toMap(String::toLowerCase, w -> 1, Integer::sum))
实际使用时,建议优先选第一种方式——它清晰、可控、易调试。如果文本来自文件,记得逐行读取并用 try-with-resources 管理流,避免资源泄漏。


















