
本文详解如何使用 HashMap 统计字符串中各单词出现次数:包括手动遍历 + 条件判断、merge() 方法简化逻辑,以及 Stream API 函数式写法,覆盖初学到进阶的三种主流实现方式。
本文详解如何使用 hashmap 统计字符串中各单词出现次数:包括手动遍历 + 条件判断、`merge()` 方法简化逻辑,以及 stream api 函数式写法,覆盖初学到进阶的三种主流实现方式。
在 Java 中实现单词频次统计(即 Word Map Counter),核心目标是将一段以空格分隔的文本拆分为单词数组,并用 Map<String, Integer> 记录每个单词及其出现次数。以下是三种推荐实现方式,按简洁性与可读性递进排列。
✅ 方式一:基础显式逻辑(适合理解原理)
private static Map<String, Integer> countWords(String text) {
Map<String, Integer> wordMap = new HashMap<>();
String[] words = text.split(" ");
for (String word : words) {
if (wordMap.containsKey(word)) {
wordMap.put(word, wordMap.get(word) + 1);
} else {
wordMap.put(word, 1);
}
}
return wordMap;
}⚠️ 注意:此写法需确保 word 非空(如连续空格可能导致空字符串进入 map)。实际项目中建议先过滤空字符串:Arrays.stream(words).filter(w -> !w.isEmpty())。
✅ 方式二:使用 merge() 方法(推荐,更健壮)
Map.merge() 是 Java 8 引入的语义化方法,专为“若存在则更新,否则插入”场景设计:
private static Map<String, Integer> countWords(String text) {
Map<String, Integer> wordMap = new HashMap<>();
for (String word : text.split(" ")) {
wordMap.merge(word, 1, Integer::sum); // key, defaultValue, remappingFunction
}
return wordMap;
}该行等价于:
→ 若 word 已存在,则执行 oldValue + 1;
→ 若不存在,则直接插入 1。
代码更短、线程安全意识更强(避免 get() + put() 的竞态隐患),是当前最佳实践之一。
✅ 方式三:Stream API 函数式风格(简洁优雅,适合现代 Java)
借助 Collectors.groupingBy 与 Collectors.summingInt,一行逻辑完成聚合:
立即学习“Java免费学习笔记(深入)”;
import java.util.*;
import java.util.stream.Collectors;
import static java.util.function.Function.identity;
private static Map<String, Integer> countWords(String text) {
return Arrays.stream(text.split(" "))
.filter(word -> !word.isEmpty()) // 建议添加空值过滤
.collect(Collectors.groupingBy(
identity(),
Collectors.summingInt(w -> 1)
));
}✅ 优势:声明式、无副作用、天然支持并行(.parallelStream())、易于扩展(如忽略大小写:.map(String::toLowerCase))。
? 总结与建议
- 初学者:从方式一开始,掌握 HashMap 的基本增查改逻辑;
- 日常开发:优先采用方式二(merge()),兼顾可读性、性能与健壮性;
- 函数式偏好 / 大数据预处理:选用方式三,配合 Stream 的链式操作与丰富 Collector;
- 生产环境补充:务必对输入做清洗(去空格、转小写、正则分词替代简单 split(" ")),例如使用 text.replaceAll("[^a-zA-Z\s]", "").split("\s+") 提升鲁棒性。
完整可运行示例(含主方法)已在答案中提供,可直接复制测试验证输出结果 {Hello=2, world=1, all=1}。


















