面试问题总结
1. 4种线程池
2. 乐观锁和悲观锁
3. sleep()和wait()方法的异同
- 这两个方法来自不同的类,sleep来自Thread类,wait来自Object类
4. 单点登录的实现方法
- 用户访问A系统,A系统是需要登录的,但用户现在没有登录。
- 跳转到SSO登录系统, SSO系统也没有登录,弹出用户登录页。
- 用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器中写入SSO域下的Cookie。
- SSO系统登录完成后会生成一个ST(Service Ticket),然后跳转到A系统,同时将ST作为参数传递给app系统。
- A系统拿到ST后,向SSO发送请求,验证ST是否有效。
- 验证通过后,A系统将登录状态写入session并设置app域下的Cookie。
有人问:如果A系统拿到ST后,不去向SSO验证ST是否有效,直接将用户信息返回A系统,并登录可以吗?
答: 不行,因为如果我在SSO没有登录,而是直接在浏览器中敲入回调的地址,并带上伪造的用户信息,A系统没办法确认ST是否正确,这样登录就是不安全的。
5. 5种索引类型
- 唯一索引
- 主键索引
- 组合索引
- 全文索引
- 普通索引
6. mybatis常用标签
7. 内连接、左外连接、右外连接的区别
#左连接
SELECT
c.cno,c.cname,t.tno,t.tname
FROM
(SELECT tno,tname FROM teachers) t
LEFT JOIN
(SELECT tno,cno,cname FROM courses) c
ON t.tno=c.tno;
#内连接
SELECT
c.cno,c.cname,t.tno,t.tname
FROM
(SELECT tno,tname FROM teachers) t
INNER JOIN
(SELECT tno,cno,cname FROM courses) c
ON t.tno=c.tno;
#右连接
SELECT
c.cno,c.cname,t.tno,t.tname
FROM
(SELECT tno,tname FROM teachers) t
RIGHT JOIN
(SELECT tno,cno,cname FROM courses) c
ON t.tno=c.tno;
内连接就只展示两边都出现的数据;
左连接以左表为主,所以尽管“陈子枢”老师在右表中没有,它也列出来了,只是,其他相关课程的字段为null;
右连接以右表为主,右表的都出现,右表没有“陈子枢”,所以右连接时,就不显示“陈子枢”老师的信息。
8. mysql执行计划
explain+SQL语句来模拟优化器执行SQL查询语句,从而知道mysql是如何处理sql语句的。
链接
链接2
9. map源码、List源码
10. 设计模式
11. 压力测试性能指标分析
12. jvm运行时内存结构和调优
13.springmvc 执行流程
- 用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器);
- 由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
- DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
- HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
- Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
- HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
- DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
- ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
- DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
- 视图负责将结果显示到浏览器(客户端)。
14. SQL优化
- 尽量避免在字段开头模糊查询(name like ‘%伟%’),会导致数据库引擎放弃索引进行全表扫描。(优化方式:如果需求是要在前面使用模糊查询,使用FullText全文索引或引入ElasticSearch)
- in 和 not in 也要慎用,否则会导致数据库引擎放弃索引进行全表扫描(优化方式:对于连续的数值,使用 between代替)
- 尽量避免使用 or,会导致数据库引擎放弃索引进行全表扫描(优化方式:使用union all代替)
- 尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描(优化方式:可以给字段添加默认值0,对0值进行判断)
- 查询条件不能用 <> 或者 !=,否则会导致数据库引擎放弃索引进行全表扫描
- 尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
- 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
- 索引并不是越多越好,因为 insert 或 update 时有可能会重建索引,一个表的索引数最好不要超过6个
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引