用HashMap统计单词频次关键在于精准切分与稳定累加:先转小写并用正则split("W+")切词,过滤空串;再用merge(word,1,Integer::sum)更新计数;文件处理需逐行读取、避免OOM;最后可排序或过滤停用词。

用 HashMap 统计单词频次,关键是把每个单词当 key、出现次数当 value,边遍历边更新。核心不在于“存”,而在于“怎么切分得准”和“怎么累加得稳”。
先干净地切出单词
直接用 split(" ") 很容易出错——标点没去掉,像 "hello!" 和 "hello" 就算两个词;空格连着标点还会产生空字符串。推荐用正则:
-
text.toLowerCase().split("\W+"):转小写 + 按所有非字母数字字符切分,自动跳过标点、换行、制表符等 - 如果要保留缩写(如
"don't"),改用text.toLowerCase().split("[^a-zA-Z']+|'(?![a-zA-Z])"),避免把撇号当分隔符切开 - 切完务必检查空字符串:
if (word.isEmpty()) continue;,否则""会被当成一个“单词”计入
用 merge() 一行搞定计数
Java 8+ 推荐用 merge(),逻辑清晰又不易错:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
freq.merge(word, 1, Integer::sum):如果word已存在,就把原值和 1 相加;不存在就设为 1 - 兼容老版本可选
put(word, getOrDefault(word, 0) + 1),语义也直白 - 别用
get() != null再手动判断——既啰嗦又可能因 null 导致 NPE
处理文件输入时注意读取方式
从文本文件统计,不能一次性读整个字符串再 split,尤其大文件易 OOM。稳妥做法是逐行处理:
立即学习“Java免费学习笔记(深入)”;
- 用
BufferedReader读每行,对每行调用split("\W+") - 每行切出的单词都统一转小写、过滤空串,再进 map 累加
- 记得 try-with-resources 自动关流,避免资源泄漏
输出前可以简单排序或筛选
HashMap 本身无序,但结果常需按频次或字母排序:
- 按频次降序:转成
stream().sorted(Map.Entry.<string integer>comparingByValue().reversed())</string> - 查某个词:直接
map.getOrDefault("java", 0) - 排除停用词(如 "the", "a"):切词后先判断是否在预设列表里,是则跳过

















