1、怎么判断一段代码写的是比较好的?或者说怎么保证写的代码质量
可读性、可扩展性、简洁性、可复用性
2、String是否继承
String(public final class String)不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的。
3、ConcurrentHashMap的底层结构
ConcurrentHashMap底层是Node数组+链表+红黑树的数据结构来实现,当链表长度大于8时,链表自动转为红黑树;并发控制使用synchronized代码块和CAS来操作。
4、CAS
CAS(Compare-And-Swap)是比较并交换
的意思,它是一条 CPU 并发原语,用于判断内存中某个值是否为预期值,如果是则更改为新的值,这个过程是原子
的。
CAS机制当中使用了3个值:内存值V,旧的预期值A,计算后要修改的新值B
5、红黑树
(1)节点是红色或黑色 (2)根是黑色 (3)叶子节点(外部节点,空节点)都是黑色,这里的叶子节点指的是最底层的空节点(外部节点),null节点才是叶子节点,null节点的父节点在红黑树里不将其看作叶子节点 (4)红色节点的子节点都是黑色 红色节点的父节点都是黑色 从根节点到叶子节点的所有路径上不能有 2 个连续的红色节点 (5)从任一节点到叶子节点的所有路径都包含相同数目的黑色节点
6、索引的底层结构
索引的底层是B+树,B树中的每个节点上存储有数据和下一个节点的内存地址,B+树中的节点只有叶子节点存储数据,其他节点上只有下一个节点的内存地址。
7、线程池的核心线程数设计应该从哪些方面考虑?
线程正常运行进行计算操作,认为线程在单位时间内的CPU使用率为100%;线程进行IO操作的时候,认为线程是挂起的;
如果IO操作需要95ms,计算操作需要5ms,为了保证CPU的使用率为100%,那么需要的线程数为 总的任务时长/计算时长,为20个,如果是N核CPU,那么线程数应该为20N。
现在考虑服务器每秒响应进程请求次数(QPS),上面整个任务进程的处理时长为100ms,那么CPU每秒可以处理进程次数为10,那么N个CPU的服务器可以处理请求的次数为200N,这个是理想的请求次数,具体还是需要根据实际考虑。
8、一级缓存和二级缓存
一级缓存
默认开启,是sqlSession级别的,sqlSession关闭,缓存就清空,增删改会刷新缓存
一级缓存就是一个map
缓存失效的情况
(1)查询不同的东西
(2)增删改操作,可能会改变原来的数据,所以必定会刷新缓存
(3)手动清理
(4)查询不通的Mapper.xml
二级缓存
Mapper文件中加入<cache/>标签即可
二级缓存也称为全局缓存,基于namespace级别的,即在一个Mapper.xml