首页 > 美团java后端一面
头像
sick白牧
编辑于 2021-08-17 14:36
+ 关注

美团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个桶,那万一分布不均匀呢?有没有考虑数字多的桶再裂开?

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

更多模拟面试

全部评论

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

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐