1、是否使用线程池就一定比使用单线程高效呢?
不是,比如Redis就是单线程的,但它却非常高效,redis基本上都是内存操作,这种情况下单线程可以很高效地利用CPU,而多线程存在相当比例的IO和网络操作,多线程带来线程上下文切换开销。
2、solr如何实现搜索的?
倒排索引,先抽取文档中词,并建立词与文档id的映射关系,然后查询的时候会根据词去查询文档id,并查询出文档。
3、Solr是一个高性能的基于Lucene的全文搜索服务器,实现了可配置,可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
4.IK分词器原理
本质上是词典分词,在内存中初始化一个词典,然后再分词过程中逐个读取字符,和字典中的字符相匹配,把文档中的所有词语拆分出来的过程。
5.Solr的索引查询为什么比数据库要快?
Solr使用的是Lucene API实现的全文检索。全文检索本质上是查询的索引。而数据库中并不是所有的字段都建立索引
6、为什么要使用FreeMarker
FreeMarker这种技术优点就是可以使表现层和业务逻辑层分离,模板只需要负责数据的展示,不需要写任何代码逻辑,FreeMarker生成的静态页面访问速度快。
7、FreeMarker是什么?
FreeMarker是一个用Java语言编写的模板引擎,它可以根据一个模板生成一个文本,应该算是一个文本生成的工具。
8、Spring Security是一个身份验证和访问控制框架。充分利用了Spring Ioc和AOP(面向切面编程)功能,提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。主要从两个方面解决安全性问题:
1.web请求级别:使用servlet过滤器保护web请求并限制URL级别的访问
2.方法调用该级别:使用Spring AOP保护方法调用,确保具有适当权限的用户采用访问安全保护的方法。
9.Web请求级别的保护
对于请求级别的安全性来说,主要通过保护一个或多个URL,使得只有特定的用户才能访问。其实就是在web.xml中配置了Spring security提供的代理Servlet过滤器。
10、排序面试题,如何排序
插入排序:
1.直接插入排序:每次将一个待排序的数据按照其关键字的大小插入到前面已经排好的数据中适当位置,直到全局数据排序完成。
2.希尔排序:希尔排序根据增量值对数据按下表进行分组,对每组使用直接插入排序算法排序,根据增量比较互换位置,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整体采用直接插入排序得到有序数组,算法终止。遇到两个相同的元素可能会交换位置。
交换排序:
3.冒泡排序:对待排序元素的关键字从后往前进行多遍扫描,遇到两个相邻两个关键字次序与排序规则不符合时,就将这两个元素进行互换,这样关键字较小的那个元素就像一个泡泡一样,从最后冒到最前面来。
4.快速排序:首先选择一个基准元素,根据基准元素将待排序队列分为两个部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后以同样的方法递归地排序划分的两部分。基准元素的选择对快速排序的性能影响比较大,所以一般会想打乱排序数组选择第一个或随机地从后面选择一个元素作为基准元素。
选择排序:
5.直接选择排序:首先在未排序序列找到最小(大)元素,存放到排序序列的起始位置,然后每次从剩余未排序元素中继续寻找最小(大)元素放到已排序的末尾,以此类推直到所有元素排序完成。
6.堆排序:堆排序是利用堆的性质进行排序的一种选择排序,先将排序元素构建一个最大堆,每次从堆中取出最大的元素并调整堆,将该最大元素放到已排好序的序列前面,这种方法相对选择排序,时间复杂度更低,效率较高。
7.归并排序:首先递归将原始数组划分为若干个子数组,对每个子数组进行排序,然后将排好序的子数组递归合并成一个有序数组。