
本文详解如何使用 HashMap 统计字符串中各单词出现次数,涵盖基础循环遍历、merge() 方法优化及 Stream API 函数式实现三种方式,并提供完整可运行示例与关键注意事项。
本文详解如何使用 hashmap 统计字符串中各单词出现次数,涵盖基础循环遍历、`merge()` 方法优化及 stream api 函数式实现三种方式,并提供完整可运行示例与关键注意事项。
在 Java 中实现单词频次统计(Word Count)是集合操作的经典实践。核心思路是:将输入字符串按空格切分为单词数组,再逐个处理单词——若单词首次出现,则以 1 为值存入 Map
以下是三种推荐实现方式,从基础到高级,兼顾可读性、健壮性与现代 Java 特性:
✅ 方式一:传统 for 循环(清晰易懂,适合初学者)
private static Map<string integer> countWords(String text) {
if (text == null || text.trim().isEmpty()) {
return new HashMap();
}
Map<string integer> wordMap = new HashMap();
String[] words = text.split("\s+"); // 使用 \s+ 更鲁棒:匹配任意空白符(空格、制表符等)
for (String word : words) {
String cleanWord = word.trim(); // 防止首尾空格导致重复键
if (cleanWord.isEmpty()) continue;
wordMap.put(cleanWord, wordMap.getOrDefault(cleanWord, 0) + 1);
}
return wordMap;
}</string></string>
? 提示:使用 getOrDefault(key, defaultValue) 替代 containsKey() + get() 双查,代码更简洁且线程安全(无竞态风险)。
Alibabacloud Sdk Client Initialization For Java下载在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
✅ 方式二:Map.merge()(推荐 —— 简洁高效)
private static Map<string integer> countWords(String text) {
Map<string integer> wordMap = new HashMap();
for (String word : text.split("\s+")) {
String cleanWord = word.trim();
if (!cleanWord.isEmpty()) {
wordMap.merge(cleanWord, 1, Integer::sum); // 存在则累加,不存在则设为1
}
}
return wordMap;
}</string></string>
merge() 是 Java 8 引入的原子操作,语义明确、性能优异,避免了显式判空和重复取值。
✅ 方式三:Stream API(函数式风格,一行逻辑)
import java.util.*;
import java.util.stream.Collectors;
import java.util.function.Function;
private static Map<string integer> countWords(String text) {
if (text == null || text.trim().isEmpty()) return Collections.emptyMap();
return Arrays.stream(text.split("\s+"))
.map(String::trim)
.filter(word -> !word.isEmpty())
.collect(Collectors.groupingBy(
Function.identity(),
Collectors.summingInt(w -> 1)
));
}</string>
该写法高度声明式,天然支持并行(.parallelStream()),适合大数据量或需链式处理的场景。
⚠️ 注意事项总结
- 空/空白输入:务必校验 null 和全空白字符串,避免 split() 返回含空字符串的数组引发误统计;
- 分隔符鲁棒性:用 \s+ 替代 " ",兼容多个空格、Tab、换行等;
- 大小写敏感:如需忽略大小写,统一转为 toLowerCase() 再处理;
- 标点符号:真实场景建议先用正则 replaceAll("[^a-zA-Z0-9\s]", "") 清洗标点;
- 返回类型:方法签名建议使用接口 Map 而非具体实现类(如 HashMap),提高扩展性。
三种方式均可直接运行,可根据项目 JDK 版本、团队规范及可维护性需求灵活选用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











