面试复盘 | 杭州有赞 Java后端 一二三面
首先夸下有赞的面试效率挺高的,一天就面完了三面,技术面的体验也都挺好,一面着重考察基础,二面考察项目,HR面了接近40min,是面过最久的HR面。。
一面 45min
一面的面试官挺友善的,交流起来没有太大压力。
自我介绍之后,面试官问了我比较擅长哪方面,答了MySQL和Redis之后,就狂问MySQL
MySQL的B+树结构是什么?聚簇索引和非聚簇索引的区别?
MySQL为什么用b+树实现索引?为什么不用红黑树、跳表、哈希?
一开始答的比较混乱,后来面试官提示说可以对比红黑树、跳表、哈希来回答。
首先是在相同的数据量下,红黑树的树高更高,IO次数会变多,而B+树的结构使得3层高度就能存储接近2000w的数据;
第二是B+树的叶子节点是按照主键顺序存放,同时使用前后指针相连,在范围查询时遍历更加方便,以及可以利用磁盘预读特性将相邻节点读取出来;
第三是哈希结构只适用于等值查询,无法在范围查询下使用。MySQL的事务实现
ACID特性。原子性和隔离性基于undo log,持久性基于redo log。具体展开可以再讲讲redo log的两阶段提交。
MySQL可重复读级别下,什么情况会出现幻读?
其实可重复读无法保证完全的隔离性。如果在事务A中,第一次select使用快照读(使用MVCC),同时另外一个事务B在第一次select的范围内插入了数据,那么如果A在第二次读时使用了当前读(for update/in share mode),此时就会出现幻读问题,因为当前读并不会使用MVCC,而是从数据库读取最新数据。
如何判断一条SQL是否使用到了索引?
explain分析执行计划
MySQL场景题:MySQL机器上CPU飙升,怎么解决?
我以为是缓存失效了,面试官说那如果是MySQL出现死锁怎么解决。于是我简单答了下打印出线程执行信息去分析,以及编写相同的事务时操作的顺序保持一致。更好的答案网上挺多博客有写。
问完MySQL之后,面试官突然邪魅一笑,说想到了一个有趣的问题,我就知道情况不妙,果然问了个让人摸不着脑袋的问题:数组下标为什么是从0开始的??
一顿瞎掰之后,面试官让我自己后面去了解下。。后来查了一些资料发现一个大致的说法是,数组的首地址就是第一个元素的地址,如果从1开始,那么每次获得第n个元素时,都要做下
n-1
操作,所以多了不必要的运算。后面就是Java相关了。HashMap中的数组容量为什么总是2的n次方?
为了扩容时转移节点不用去重新计算hash值,通过与运算判断后直接把元素放到新数组的原位置or原位置+旧数组长度。
ConcurrentHashMap中线程是怎么去协助扩容的?他是怎么知道扩容已经结束了?
JVM八股:内存布局、回收算法、GC Root可达性分析、内存分配担保、CMS G1
线程池场景:核心10、总数10、队列20,瞬间60个线程请求,在线程和队列都饱和的情况下有多少个线程会触发拒绝策略?(60-10-20=30个)
简单讨论了下实习的内容,在学校做项目遇到技术问题时怎么处理
二面
二面的话会去抠项目细节,面的头很大。没有录音,写一些印象比较深刻的问题
- 项目是做什么的的,有哪些技术难点,为什么不用其他技术方案实现 等等等;实习做了哪些工作
- 悲观锁和乐观锁的场景,扣减库存的场景应使用哪一种锁?
- 你的项目里网关的鉴权流程?
- 缓存和DB一致性怎么保证?
答了让后台的线程使用队列去串行化更新,然后面试官问可以由客户端请求的线程来更新缓存吗?
我说可以,更新时使用分布式锁保证只有一个请求的线程在操作 - 接着面试官就问了分布式锁的使用会有什么问题?这里答的不是很好,后来才知道问的应该是锁的唯一性、可重入等问题。。
- Redis除了缓存、分布式锁还有其他场景吗?
- API和SPI区别
- 讲一下依赖倒置
- 项目有使用到什么设计模式吗?(策略模式)
HR面
HR面了很久,感觉很看重你对公司的意向,对过往经历问的很细。。。主要围绕下面几个部分
- 实习的收获,为什么不去实习公司
- 家庭环境、从小到大有经历过什么困难吗
- 团队中出现分歧怎么办
- 都投了哪些公司,为什么
- 比赛时印象最深的困难
讨论
想和大佬们讨论下
- 扣减库存的场景应使用乐观锁or悲观锁?
- 缓存DB一致性的保证有没有更好的解决方案呢?
- MySQL机器上CPU飙升,怎么解决?
总结
首先在基础方面自己要有比较擅长的一块,这样如果面试官给力的话会让你说自己擅长的,不然也可以引导面试官向自己擅长的部分去提问,尽量给自己加分。二面的面试官会根据你的项目去引申出一些场景题,所以对于项目使用到的技术栈还是要多去思考,之前一直背八股文,导致对于一些实际场景的使用不了解,继续改进。最后许愿offer~
#面试复盘##有赞##面经##java工程师#