- 一面电话
- 二面视频(需要写代码)
- 视频一
- 视频二
- 视频三
时长:30分钟
实际:25分钟的样子
难度:一般
- Nacos注册中心原理
从raft选举到pull、push整个流程
- Dubbo调用原理
首先跟面试官说了dubbo怎么把服务注册到nacos中,再到从nacos中获取注册服务列表,调用的几种方式和负载均衡算法
- Dubbo中3个消费者、4个提供者共建立了多少个连接
这个题回答了好久,主要是前面问了nacos,还以为dubbo跟nacos建立了多少链接,后面面试官说消费者和提供者怎么连接的
我:默认是dubbo协议
面试官:dubbo底层用了什么
我:TCP
面试官:难道发送一次请求就立马断掉连接吗
擦… 秒懂,所以面试的时候一定要细心听清楚问题
- Redis中什么是缓存穿透和缓存击穿,怎么解决
…说了很多,面试来了句缓存击穿用分布式锁那不等于后面请求都是串行的,后面说了好几种方式发现都不行… 这个问题就这么过了
- Redis为什么这么快
数据存储在内存中、多路复用…说了每个数据结构比如string用的是SDS、zset用了跳表和压缩列表…
- 在高版本中Redis用了多线程怎么保证线程安全的
命令解析用的是多线程,其它还是单线程处理
上午面试的,下午HR就给预约了二面,说需要电脑要写代码,慌的一塌糊涂
二面视频(需要写代码) 视频一时长:60分钟
实际:50分钟的样子
难度:一般
晕了。。。。问了些什么都忘记了,只记得两道编程题
大约问了10分钟的八股文就开始写代码,我说用IDEA可行,他说太麻烦了,直接用的是腾讯文档共享写的, 慌。。。。。。
- 二分查找
这个简单^ ^
public int binSearch(int[] array, int value) {
int lng = array.length;
int median = lng >> 1;
if (array[median] == value) {
return median;
}
int start = 0;
int end = lng - 1;
while (start <= end) {
median = ((end - start) >> 1) + start;
if (array[median] < value) {
start = median + 1;
} else if(array[median] > value) {
end = median - 1;
} else {
return median;
}
}
return -1;
}
面试官: 你写的这个方法有什么问题
我:array没判断空、value需要判断大于等于0
面试官:为什么用int value 而不用Integer value
说了各自使用场景和存储方式
- 单例
public class Test {
private Test() {}
public static final Test getInstance() {
return TestHolder.LAZY;
}
private static class TestHolder {
private static final Test LAZY = new Test();
}
}
面试官:实现单例有几种方式
我:懒汉、饿汉、枚举、容器化…
面试:为什么用双重检查锁
从指令重排序、可见性开始说起…
上午面的试 中午就给了二面视频二
视频二时长:60分钟
实际:55分钟的样子
难度:有点难度
额。。。。问了些什么也给忘记了,都挺简单的问题
- 二叉树中序遍历转双向链表
static class Node {
private Node pre;
private Node next;
private Object obj;
public Node(Object obj) {
this.obj = obj;
}
}
static class TreeNode {
private TreeNode left;
private TreeNode right;
private Object obj;
}
public static Node recursiveTraversal(TreeNode treeNode, Node node) {
if (treeNode != null) {
recursiveTraversal(treeNode.left, node);
if (node == null) {
node = new Node(treeNode.obj);
} else {
node.pre = node;
node.next = new Node(treeNode.obj);
}
recursiveTraversal(treeNode.right, node);
}
return node;
}
汗…没写对,应该把中序遍历结果保存到list中,然后list再转双向列表就简单多了…
上午面的试,算法没写对以为结束了,没想到给过了,估计八股文回答的还不错,中午就给了二面视频三
视频三时长:60分钟
实际:90分钟 严重超时了
难度:有点难度
- Mysql中B+树原理
- B+树和B树有什么区别
- Mysql中为什么不使用红黑树
- SQL优化
- RC和RR区别
说了RC、RR解决哪些问题、MVCC实现原理
面试官:你平时用的是那种模式
我:一般都是RC,并且说了为什么会用RC
面试官:什么情况下用RR
我:想了下,实在没想到那种场景会用到RR
面试官说了一个场景,我也没听明白,-_-|| 这里聊了很久,没get到点 - spring 循环依赖是怎么解决的
- spring bean生命周期
- SpringBoot启动原理
- AQS中使用哪些设计模式
没回答上来
- AQS原理
- 有没有自己实现过AQS
没自己实现过
- JVM 内存模型
- 有哪些垃圾回收算法
- 垃圾回收器有哪些
- CMS和G1有什么区别
…
此时时间已经过了一个小时了,还以为没算法题了
- 爬楼梯
面试官:最近有刷算法题吗,有的话就写个有意思的算法
我:别…没有,面试公司貌似只有贵公司需要写算法
面试:那就写个爬楼梯 每次只能走1或者2个台阶
我:…
还好这题之前瞅了眼,不然什么叫爬楼梯都不知道
public static int climbStairs(int n) {
if (n <= 2) {
return n;
}
return climbStairs(n - 1) + climbStairs(n - 2);
}
此时面试官说这是递归形式,能优化下吗
public static long climbStairs2(int n) {
if (n <= 2) {
return n;
}
int x = 1;
int y = 2;
for (int i = 3; i <= n; i++) {
int t = x + y;
x = y;
y = t;
}
return y;
}
面试官:上面递归会有什么问题
我:超过int最大值、不能为负数
面试官:还有能
我:额… 想不起来
其实还有一个比较重要就是会导致栈溢出
下午4点半面试的,等了一周HR说没过,问了为什么,说上面没写… 回想下整个面试过程就两块没回答好 一个是RC、RR还有一个是递归查询没说具体问题



