美团java后端一面

  1. 介绍项目

  2. 介绍论文

  3. 你的简历上说了会java的同步编程?有哪些?

    synchronized / volatile / ReentrantLock

  4. 说一下synchronized关键字用在哪些地方?具体怎么实现的?

    锁方法/锁对象/锁类/锁代码块。

    讲了堆区的五种状态+mask word,balabala

  5. 以下代码由两个线程调用a()和b()会阻塞吗?

class A{
    public void synchronized a(){

    }
    public void b(){
        synchronized(A.class){

        }
    }
}
  1. 以下代码由3个线程分别调用a() b() c(), 那a()与b(),a()与c(),b()与c 会阻塞吗?
class A{
    public void synchronized a(){

    }
    public void b(){
        synchronized(A.class){

        }
    }
    public void synchronized c(){

    }
}
  1. 说一下volatile。

    有序性/可见性,没有实现原子性。

  2. 你说的原子性是什么?如以下代码,为什么说他没有实现原子性?

    class A{
        volatile String temp;
        public void fun(){
            temp = new String("aa");
        }
    }
  3. 再说说ReentrantLock的实现。

  4. 为什么把它叫做可重入锁,synchronized也是可重入的吗?

    不知道...

  5. 说一下公平锁和非公平锁?默认是哪个?为什么它是默认的?

  6. 你的项目遇到了哪些数据库的优化?

    索引和redis。索引应该通过字段的可区分度来从左到右建立,如a有300种取值,b有150种取值,c有10种取值,则索引顺序应该是(a,b,c)

  7. 你说的这种情况,假如a的300种取值是不均匀的,比如有10个频率特别高,其他290个特别低,你说的按可区分度也能这样建索引吗?

    那就求方差作为可区分度吧。

  8. SpringBoot有什么好处?

  9. 常见的linux命令?如何查在一个文件里指定字符串出现了几次?

  10. 讲一下四次挥手,为什么不能三次?

  11. 服务器端在发送完FIN后还能收到数据吗?

  12. 客户端什么时候开始不再接收数据?

  13. TIME_WAIT是在什么时候,为什么要TIME_WAIT?

  14. 有10亿个整形数据,用逗号分割在一个文件里,将排序后的写到另一个文件里。要求思考3min,然后说思路,接下来5min写伪代码。

    我:将每个整形数/(Integer.MAX_VALUE/10),分配到10个桶里,然后分别排序,序号小的桶必然在前面。还有个优化的点就是用频率压缩长度。

    (打断)

    面试官:你说分配到10个桶,为什么是10个?不能100个?1000个?越多越好吗?极端点,一个数一个桶不更好吗?

    我:数量少的时候是越多越好,但感觉有个阈值,暂时想不出来...

    面试官:那我换个问题,你觉得分桶一定会比不分桶快吗?

    我:是的...

    面试官:你写代码吧。

    我:

    public List<> fun(int[] a){
        List<Integer>[] list = new ArrayList<>()[10];
        for(int e:a){
            list[e/Integer.MAX_VALUE/10].add(e);
        }
        ...
    }

    (打断)

    面试官:题目说的是10亿个整型数存在文件,用逗号分隔,你可以用int[] 存下传入吗?

    我:如果是很长的string的话,那就用两个指针指向string,一个指针指向数字的开头,另一个指针到逗号为止,将两个指针间转int,再分桶处理。

    面试官:你要用指针说明已知String的长度,String也存不下。

    我:

    class Main{
        public static void main(String[] args){
            Scanner scanner  = new Scanner(System.in);
            String temp = "";
            List<Integer>[] list = new ArrayList<>()[10];
            while(scanner.hasNext()){
                char c = scanner.nextChar();//没有这个方法,不过面试官说不介意
                if(Charcter.isDigtal(c)){
                    temp += c;
                }else{
                    int e = Integer.parseInt(temp);
                    list[e/(Integer.MAX_VALUE/10)].add(e);
                    temp ="";
                }
            }
            ...//排序
        }
    }

    面试结束,然后是复盘环节,还是这道题。

    面试官:

    • 你觉得没有负数?
    • 你怎么看到10亿个数呢?如果是100亿,1000亿呢?10亿个数文件大约是多大?其实是可以存下的。我希望你答出linux操作系统允许的单个文件最大大小。结果你没提到。
    • 分桶方法并不会变快,就如我说的极端情况。
    • 你分成了10个桶,那万一分布不均匀呢?有没有考虑数字多的桶再裂开?

总结:面试官的个人风格很强,问问题很犀利,不喜欢我背八股文,动不动他就现场手写一串代码让我分析,真的学到了很多东西,眼过前遍不如手过一遍。而且处处中引导我,教我思考问题的方式,就比如最后一道算法题,压根就不是算法,是场景...大多数都没答好,估计是凉了,但是学到了很多东西,感谢面试官小哥~

#美团22届秋招面试##面经##校招##美团##Java工程师#
全部评论
确实强,比那些只问八股的要好的多
3 回复 分享
发布于 2021-08-16 19:30
所以是啥部门呢?
1 回复 分享
发布于 2021-08-17 11:16
这个场景题我第一反应是考察外部排序和Java流对文件的读写。Linux最大单个文件长度我是没想到的哈哈哈,不过如果生产环境遇到过这种问题的话,的确是会第一反应说“哎!我遇到的过这个问题,我们服务器用的操作系统是Centos7,当时还发现一个文件放不下这么多int!”感觉难度还是蛮高的,感谢楼主分享,一起学习!
1 回复 分享
发布于 2021-08-17 13:07
请问判断是否阻塞的那几题怎么回答
点赞 回复 分享
发布于 2021-08-16 19:21
。。。大佬优秀 感觉看您的帖子每次都有收获
点赞 回复 分享
发布于 2021-08-16 23:17
感谢分享,请问楼主是base成都的吗?到店还是到家还是鸡架啊?
点赞 回复 分享
发布于 2021-08-17 10:24
u1s1,你的场景题是真的不容易,我一开始的思路是哈希分块,其实跟分桶差不多,但是哈希码长度可以视数据量而定,自然分桶的数量也可以跟着变,所以不是定值。但是谁能想到这个问题涉及linux的单个文件的最大大小?不过面试过不过应该还是看整体感觉的,还有同一场的对手发挥,也不是纠结一两个问题答得好与不好的,lz也不必失落
点赞 回复 分享
发布于 2021-08-17 10:44
楼主是啥时候面的试啊?
点赞 回复 分享
发布于 2021-08-17 11:14
mark
点赞 回复 分享
发布于 2021-08-17 11:37
lz笔试ac几道啊
点赞 回复 分享
发布于 2021-08-17 16:10
美团秋招技术是2面还是3面呀
点赞 回复 分享
发布于 2021-08-17 16:53
第八题怎么解释的呢
点赞 回复 分享
发布于 2021-08-17 17:04
存整型用bitmap最优吗?
点赞 回复 分享
发布于 2021-08-18 13:11

相关推荐

10 101 评论
分享
牛客网
牛客企业服务