首页 > 社招:蚂蚁金服一面
头像
澹台灭明201712241839719
编辑于 2021-10-19 10:11
+ 关注

社招:蚂蚁金服一面

时间:2021年10月18日,晚上7点~晚上8点14分
持续时间:1小时14分钟左右
形式:电话面试+线上撸代码
过程描述:
1、自我介绍(主要是技术栈和项目介绍,项目介绍是重中之重)。
2、接着自我介绍中提到的MySQL查询优化三板斧,讲讲你的这三板斧是什么?
3、发来了连接,然后给出一个mysql table:student。包含字段有:id, score,student,classId,studentId...
现在有个组合索引:classId+studentId,给出三条SQL语句如下:
select score,studentId where classId = 100;
select score,studentId where studentId = 100;
select score,studentId where classId = 100 and studentId = 100;
这三条SQL哪些会用到索引来提高缓存命中率?为什么?
4、讲讲你们项目中用到的MySQL索引是什么?有什么特点?
5、如果
select score,studentId where classId = 100 and studentId = 100;
该条SQL查询的数据是常用的热点数据,而且表的数据量大,你说说如何优化?
我的回答是从MySQL视图应用,大表查询优化等方面,最后面试官提示补充了一下,从
id,和classId作为索引的区别。
6、围绕第5点,讲讲聚簇索引和其他索引的区别。
7、继续讲项目,你们项目中哪些地方用到了多线程?然后讲到线程池的底层,涉及BlockingQueue。
它的特点是什么?
8、线上手撸一个等待阻塞队列,实现put方法和take方法,重点突出它是如何实现阻塞等待。
我采用的是数组作为底层实现,动态扩容,在take方法加同步锁。写出来以后,面试官提示,同步锁只能
使得带take不到元素后,线程阻塞,无法通知。实际上用到了信号量,和wait/notify方法。这点我没想到,之前也没有
深入研究。不过面试官暴露了他的的错误点,线程的通信方式有三种,不止wait/notify,同步sync和volatile也是可以的。
然后这个问题被跳过。
9、继续讲项目,然后面试官打断,问我对JVM了解,是吧?线上给了代码,如下:
public class ATest {
    private volatile int j = 1;
    
    public void add(i <= 100) {
        j++;
        i++
    }
    
    public static void main(String [] args) {
        ATest a = new ATest();
        a.add();
    }
}
判断j的输出值是多少?我回答后讲了一下原理。volatile保证可见性,不保证原子性,j++不是原子操作,然后反问面试官的看法。
他讲的答案好像是 j <= 100。说了volatile优化了jvm指令重排。我反问了一句,这和我学到的不一样啊?查到资料显示,volatile是禁用
JVM指令重排。然后我讲了一下如何优化,面试官表示不置可否。
10、线上算法题。s,t都是字符串序列,判断s是否是t的子序列,是返回true,否返回false。
输入演示:
示例1:
输入s = "abe", t = "abcdef",输出true。
输入s = "afb", t = “abcdef”,输出false。
可用Java的API,可以写伪码,当然也可直接写出来。
最开始我以为是考察子字符串替换,用Java的replaeAll。写出来后,面试官提醒,是子序列,不是子串。
然后他给我限定了一个函数,让我实现。
由于面试时间已经很久了,面试官不断提醒,大致框架或者伪码写出来,讲一下思路就可以。
我采用了最直接的暴力解法,就一些细节,面试官也问了。
这个解法主要用到equals方法,包括equals左右写什么,面试官都会问到。
public class Main {
    // s作为子字符串序列,t是完整字符串序列
    public boolean fun(char [] t, char [] s) {
        char [] temp;
        for (int i = 0;....) {
            for(int j = 0; ...) {
                if (s[j].equals(t[i])) {
                    // 如何匹配,将字符加入到临时的字符数组中
                }
            }
        }
        // 最后通过判断临时的字符数组大小和子序列s的大小是否一致来决定返回值
    }
}
11、面试官想撤,我最后主动问了几个问题,然后结束。

更多模拟面试

全部评论

(5) 回帖
加载中...
话题 回帖

近期热帖

热门推荐