面试总结
判断链表有环
- 使用map存放一访问过的节点,访问新节点时判断是否在map中存在即可;
- 使用快慢指针,当两个指针存在两次指向同一个位置时即存在环
md5加密的原理
平衡二叉树、B树、B+树
平衡二叉树:
采用二分法的思想,数据结构为数据和左右指针;
特性:二叉,节点的度0~2。左边小右边大。左右两边层级树相差不会大于1。
平衡算法:Treap、红黑树
B树:
- 节点数据结构为n个数据和m个指针;
- 非叶子节点的度(树的阶)m >= 1;
- (平衡的关键之一)每个节点关键字数量和指针数量关系满足 m/2 <= n+1<= m,舍得关键字不会扎堆在某个节点;
- (平衡的关键之二:控制树高度):叶子节点都在同一层,这个限制了树的成长方向为偏向横向成长。
B+树:
- 在B树基础上的变种
- 节点数据调整,非叶子节点不保存数据只保存关键字,让节点可以容纳下更多关键字从而较少树的高度。叶子节点保存父节点所有关键字的指针地址,即每次访问到叶子节点才能获取数据
- 叶子节点从左往右以链表的形式传起来,有利于提高缓存命中率和全表扫描
- 总的来说,B+树牺牲了有限的空间换取了查找效率和稳定性 B-Tree索引,myisam和innodb中索引的区别 myisam索引:b+树实现,叶子节点上保存的是数据的引用; innodb索引:b+树实现,叶子节点上保存数据,数据文件本身就是主键索引文件,其他索引data保存的是主键的值
架构设计如何选型
- 业务架构:业务的架构上首先要理解业务,包括当前业务、前瞻业务,搞清楚我们今天面临的业务量有多大,增长走势是什么样,而且解决高并发的过程,一定是一个循序渐进逐步的过程。这样可以付出较为合理的代价换来真正达到技术引领业务成长的效果。
- 应用架构:应用架构承上启下,一方面承接业务架构的落地,另一方面影响技术选型。熟悉业务,形成业务架构,根据业务架构,做出相应的应用架构,最后技术架构落地实施。如何针对当前需求,选择合适的应用架构,如何面向未来,保证架构平滑过渡。系统可独立部署的应用的划分,明确各个应用的边界。应用架构定义系统有哪些应用、以及应用之间的协作与关系,主要有两个关键:职责划分和职责之间的关系。可以通过水平的功能顺序的划分、垂直业务的划分,通过划分来平衡业务和技术的复杂度
- 代码架构:技术栈的选择,框架、类库选择、代码规范、接口规范
- 技术架构:非功能性需求,对系统拓展性、高可用、高性能、伸缩性
多线程项目运用的地方
任务式的需求,比如数据消费、数据推送、数据调度
高并发遇到的问题,怎么处理
ioc底层实现
从设计上看,ioc是工厂模式的设计。
redis为什么查询快,停电怎么办
什么是垃圾回收,怎么判断哪些对象是垃圾
mybatis一级,二级缓存,拦截机制 mybatis将sql从硬编码中抽离出来,可以更加灵活使用sql。主要提供了一些组件,对sql执行流程进行包装: 高层组件sqlSession、executor、statmentHandler, 底层执行组件:paramterHandler、typeHandler、ResultSetHandler, 还提供了更加灵活的插件interceptor
arraylist为什么比linklist快 数据是连续的,通过首地址和偏移量可直接地位到地址
spring底层实现,启动逻辑
高并发时怎么限流
线程池的拒接任务策略
springboot的启动流程
1、准备环境:推断servlet还是reactive、初始化启动事件发布、配置文件加载、log配置加载【查找ApplicationContextInitializer、ApplicationListener、SpringApplicationRunListener(启动事件发布器)】 2、创建容器:无参数构造器 3、初始化容器:设置环境Environment、提前实例化ConversionService、springCloud项目则回先初始化父容器(bootstrap配置) 4、刷新容器:创建bean 5、执行CommandlineRunner、ApplicationRunner