// 预先 设置初始容量,以免扩容影响性能。
Map wordMap = new HashMap(words.size());
for (String word : words) {
Map nowMap = wordMap;
for (int i = 0; i < word.length(); i++) {
// 转换成char型
char keyChar = word.charAt(i);
// 判断是否已经有一个map树,只有在一个词的首字符有用
Object tempMap = nowMap.get(keyChar);
if (tempMap != null) {
// 存在,则共享一个map树根
nowMap = (Map) tempMap;
}
// 不存在则构建一个map树,
else {
// 设置状态位
Map<String, String> newMap = new HashMap<String, String>();
// 判断是设置 0还是1
newMap.put(“isEnd”, i == word.length() - 1 ? “1” : “0”);
// 给keyChar该字符设置状态位
nowMap.put(keyChar, newMap);
// 将状态位map赋值给nowMap,表示下一个字符的指针和状态位在同一个map里。
nowMap = newMap;
}
}
}
// 上面始终修改的是nowMap,最后形成的是wordMap,原因是,预先wordMap赋值给了nowMap,
// 使得wordMap和nowMap中的map地址值共享,更新了nowMap中的map就是更新了wordMap。
m_kwWordMap = wordMap;
}
/**
-
检索关键词
-
@param txt 被检索的文本
-
@param beginIndex 被检索文本的开始位置
-
@param matchType 匹配类型
-
@return 返回检索到的关键词长度,用于从文本中截取
*/
public static int checkWord(String txt, int beginIndex, int matchType) {
// 匹配标识数默认为0
Map nowMap = m_kwWordMap;
int matchFlag = 0;
int matchMaxFlag = 0;
for (int i = beginIndex; i < txt.length(); i++) {
char word = txt.charAt(i);
// 获取指定key
nowMap = (Map) nowMap.get(word);
// 存在,则判断是否为最后一个
if (nowMap != null) {
// 找到相应key,匹配标识+1
matchFlag++;
// 如果为最后一个匹配规则,结束循环,返回匹配标识数
if (“1”.equals(nowMap.get(“isEnd”))) {
// 将matchFlag赋值给matchMaxFlag,为的是,
// 后面要是继续按最大匹配原则匹配时,匹配不到则按最小匹配原则的结果为准。
matchMaxFlag = matchFlag;
// 最小规则,直接返回,最大规则还需继续查找
if (MIN_MATCH_TYPE == matchType) {
break;
}
}
}
// 不存在,直接返回
else {
break;
}
}
return matchMaxFlag;
}
/**
-
从文本中检索出关键词
-
@param txt 被检索的文本
-
@param matchType 匹配类型
-
@return
*/
public static Set getWord(String txt, int matchType) {
Set set = new HashSet();
for (int i = 0; i < txt.length(); i++) {
// 判断是否包含关键词,length > 0 有,且是关键词长度
int length = checkWord(txt, i, matchType);
// 存在,加入set中
if (length > 0) {
// 从原文中截取 并放入set
set.add(txt.substring(i, i + length));
// 减1的原因,因为for会自增
i = i + length - 1;
}
}
return set;
}
private static Map m_kwWordMap = null;
// 最小匹配原则,如果关键词中有中国和中国人,文本内容为“我是中国人”,最小匹配原则匹配出中国
public static final int MIN_MATCH_TYPE = 1;
// 最大匹配原则,如果关键词中有中国和中国人,文本内容为“我是中国人”,最大匹配原则匹配出中国人
public static final int MAX_MATCH_TYPE = 2;
}
// wordMap={程={isEnd=0, 序={员={isEnd=1}, isEnd=0}}, 产={品={总={监={isEnd=1}, isEnd=0}, isEnd=0, 经={理={isEnd=1}, isEnd=0}}, isEnd=0}}
// haveWords=[产品经理]
-
DFA算法利用map套map的原理,极大程度上优化了检索性能,时间复杂度为小于等于O(n),n是被检索文本的长度。
-
DFA实现的关键词过滤,性能不再受限于关键词的数量,只与被检索的文本长度有关。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/8b754aa2791728cf1efebad829d90b04.jpeg)
总结
面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。
我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
面试题及解析总结
大厂面试场景
知识点总结
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
[外链图片转存中…(img-CjPYiJlK-1712426497470)]
大厂面试场景
[外链图片转存中…(img-Po5785Jh-1712426497470)]
知识点总结
[外链图片转存中…(img-VDzej8Nu-1712426497470)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!