hashset存敏感词+滑动窗口扫描是轻量级过滤方案:预加载小写去重词集,嵌套循环枚举子串并contains检查,适合简单场景;但存在o(n²)性能瓶颈、不支持模糊匹配等缺陷。

用 HashSet 存敏感词、用迭代器遍历检查,是轻量级敏感词过滤的常见做法。核心思路是:把敏感词预加载进 HashSet(O(1) 查找),再对文本逐词或逐段扫描,用迭代器辅助判断是否命中。但要注意——直接用 String.split 或简单遍历字符容易漏匹配(如“苹果”在“苹果手机”里会被跳过),所以实际中更常用的是“滑动窗口+子串检测”或“前缀树”,而 HashSet + 迭代器适合规则简单、词少、且允许部分误伤/漏检的场景。
准备敏感词集合:用 HashSet 快速查重和查找
HashSet 保证插入去重、查找高效,适合存储已知的固定敏感词列表:
- 初始化时从配置文件、数据库或常量加载敏感词,全部 add 进 HashSet;
- 建议统一转小写(或按需处理大小写),避免 "Sex" 和 "sex" 被当成两个词;
- 可加简单清洗:trim() 去首尾空格、过滤空字符串,防止脏数据干扰。
文本扫描逻辑:用 for-each 或显式迭代器检查子串
不能只切词再查(中文没天然空格分词),而是用嵌套循环模拟“滑动窗口”,枚举所有可能子串,再用 HashSet.contains() 判断:
- 外层 i 从 0 到 text.length(),表示子串起始位置;
- 内层 j 从 i+1 到 Math.min(i+maxLen, text.length()+1),控制子串长度(避免过长影响性能);
- 每次取 text.substring(i, j),用 set.contains() 检查——这时虽没显式调用 Iterator,但内部 HashSet 的 contains 方法底层依赖哈希查找,比遍历 List 快得多;
- 若想显式用迭代器(比如做自定义跳过逻辑),可用 set.iterator() 遍历敏感词,再用 text.contains(word),但效率低,仅当词集极小或需动态条件时考虑。
基础实现示例(含替换与中断)
以下是一个简洁可用的过滤方法:
public class SensitiveFilter {
private final Set<string> sensitiveSet = new HashSet();
<pre class="brush:java;toolbar:false;">public SensitiveFilter(List<String> words) {
words.stream().map(String::trim).filter(s -> !s.isEmpty())
.map(String::toLowerCase).forEach(sensitiveSet::add);
}
public String filter(String text) {
if (text == null) return null;
String lowerText = text.toLowerCase();
StringBuilder result = new StringBuilder(text);
// 滑动窗口扫描
for (int i = 0; i < lowerText.length(); i++) {
for (int j = i + 1; j <= Math.min(i + 10, lowerText.length()); j++) {
String sub = lowerText.substring(i, j);
if (sensitiveSet.contains(sub)) {
// 替换为 * 号,长度一致
String stars = "*".repeat(sub.length());
int start = i, end = j;
result.replace(start, end, stars);
// 跳过已替换区域,避免重复触发(可选)
i = j - 1;
break;
}
}
}
return result.toString();
}
}
注意事项和优化方向
这种方案够快够简单,但有明显局限:
- 时间复杂度最坏 O(n²),长文本+长敏感词会变慢,生产环境建议改用 DFA(如 Aho-Corasick 算法);
- 不支持模糊匹配、拼音替换、同音字(如“谐音”“火星文”),需额外预处理;
- 敏感词之间有包含关系时(如“牛”和“牛肉”),短词可能先被匹配,导致长词失效——可按长度倒序排序后优先匹配长词;
- 如果要支持“忽略标点”或“跨词匹配”,得先做分词或正则预处理,HashSet 本身不解决语义问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











