Java面试总结

1.分页
在项目中分页分为两种:
1.1数据库sql语句分页:
1.1.1SQLServer语句分页
select * from (
select ,row_number() over (order by id) as rownum from t1
) t where t.rownum>=startrow and t.rownum<=endrow
1.1.2Oracle语句分页
select * from (
select * from (
select t.
,row_number() over (order by Id) as rownum
from t
) p where p.rownum>first
)
where rownum<=pagesize
1.1.3MySQL语句分页
select * from table limit ((pageindex-1)*pagesize,pagesize)
注意:pageindex代表当前页数,pagesize代表每页数据记录数
1.2框架自带分页插件
1.2.1Mybatis自带分页插件PageHelper
1.2.2Hibernate自带分页·类
HQL语句分页:
Query query = session.createQuery(sql);
query.setFirstResult((pageindex-1)*pagesize);
query.setMaxResult(pagesize);
List result = query.list();
Criteria分页:
Criteria criteria = session.createCriteria(Example.class);
criteria .setFirstResult((pageindex-1)*pagesize);
criteria .setMaxResult(pagesize);
List result = criteria .list();

2.多线程状态
新建、就绪、运行、阻塞、死亡状态
3.redis数据库穿透与数据库雪崩
穿透指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这样导致导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
穿透解决办法:
1.对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃。还有最常见的就是采用布隆克隆器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
2.如果查询结果返回为空(不管是数据不存在还是系统故障),仍然把空结果进行缓存,但它的过期时间很短,最长不超过5分钟。
缓存雪崩:如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成缓存雪崩。
雪崩解决办法:
1.在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2.通过缓存reload机制,预先去更新缓存,在即将发生大并发访问量前手动触发加载缓存。
3.不同的key设置不同的过期时间,让缓存失效的时间点尽量均匀。
4.做二级缓存或者双缓存策略。A1位原始缓存,A2为拷贝缓存,A1失效时访问A2。A1缓存失效时间设置为短期,A2为长期。
4.socket
5.权限设计需要哪几张表
6.mybatis中#与KaTeX parse error: Expected 'EOF', got '#' at position 8: 符号的区别 #̲可避免SQL注入,相当于占位符…相当于字符串拼接
7.sql语句中in与exists的区别
in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快
遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
 如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
8.delete与truncate区别
delele删除的数据可恢复且数据结构还在,ID主键会自动新增
truncate删除的数据不可恢复,且ID主键会从0开始
9.document与jquery如何转换
10.数据库行转列
privot
11.union all与union的区别
nion与union all都是将两个结果集合并为一个
union去重且排序
union不去重且不排序
效率上:union all比union快
12.sql去重的两种方式
distinct关键字去重
13.多线程
14.mrp的SQL语句
15.mybatis里面多个参数如何传递
第一种:封装成实体类
第二种:使用map封装数据传递
16.递归查询

你可能感兴趣的:(面试总结,java面试题)