美团超详细面经(附答案)二三面

美团超详细面经(附答案)二三面

Java识堂,一个高原创,高收藏,有干货的微信公众号,一起成长,一起进步,欢迎关注

一面地址

二面

一面过了没多久,就立马通知二面了,中途感觉有点饿了,美团还挺人性话的,在后面的桌子上放了一堆饼干,忘了饼干的名字了,总之特别好吃,我吃了好几块。

  1. 自我介绍
  2. 项目介绍,及其亮点介绍。
  3. 答:这个继续这篇文章就是背;可以作为你面试的项目亮点的文章,不来看看吗?
  4. 然后问了我集合了解吗,让我说话ArrayList和LinkedList的区别?
  5. 答:ArrayList底层是数组,LinkedList底层是链表,ArrayLIst查找数据快,LinkedList插入删除快;
  6. 继续问我linkedList可以用for循环遍历吗?
  7. 答;能不用尽量不要用,linkedList底层是链表,它使用for进行遍历,访问每一个元素都是从头开始访问然后直到找到这个元素,比如说找第三个节点,需要先找到第一个节点然后找到第二个节点;继续找第4个节点,不是从第三个节点开始找的,还是从第一个节点开始,所以非常的慢,不推荐,可以用迭代器进行遍历。
  8. 介绍一下ConCurrenthashmap
  9. 答:我感觉是因为一面问了hashmap,所以二面面试官可能是看见了面试记录,额,这块我非常熟,这个我又讲了很长时间,讲了ConCurrentHashMap的底层的分段锁的结构,讲了ConCurrentHashmap的get源码,get源码是没有使用锁的,这里我把get源码背写了下来,并给面试官讲了get源码在插入修改删除的多线程下是安全的;然后讲了put操作,remove,扩容操作,然后讲了在1.7和1.8的区别,引入了红黑树,链表长度大于8转换成红黑树,采用了CAS+synchronized来保证并发安全,吧啦吧啦又讲了挺长时间;
  10. 来看看这道题,说着拿出来一个小纸条
  11. 答:这个纸条感觉每个面试官都是只有纸条,所以尽可能地和周围的同学多交流,有一定的肯可能他的面试官就你的面试官。题目:让我自己手算a,b,c,d的值,
美团超详细面经(附答案)二三面

  1. 结果是a = 8b=5,c=7,d=35.计算完我问他对不对,他没勒我。。。
  2. 然后问我单利模式了解不,写一个单例模式?
  3. 答:这个之前准备过,我写了一个双重锁的单例模式。
美团超详细面经(附答案)二三面

  1. 接着问了我虚拟机了解吗,介绍一些虚拟机的内存模型?
  2. 答:这个之前也准备过,这里要注意了,虚拟机的内存模型和运行时的数据区域不是一回事;虚拟机内存模型又叫JMM,就是每个线程有自己的工作内存,然后又一个主内存,线程工作的时候都是在自己的工作内存中拷贝一个主内存的副本;还说了JMM的happens before原则,程序顺序原则,锁原则,线程中断原则,传递性原则,还有其他的没想起来就没说了。
  3. 介绍一些你了解的垃圾回收算法?
  4. 答:标记清除,标记整理,复制算法,把每个算法是啥说了一遍;
  5. 问到这里,问了我你知道SurvivorRatio这个参数为啥初始是默认的8:1:1吗?
  6. 答:这个由于刚才刚问了垃圾回收算法,我觉得可能有关联,于是我说,方便复制算法操作,Eden区域大多数都是朝生夕死的,这个比例,可以方便复制算法的中from和to来回进行复制存活的对象,额,说完,他没有说啥,感觉是默许了吧;
  7. 突然又问,二叉树了解吗,写一个二叉树的深度搜索遍历?
  8. 答:当时我听到中道题,有点懵,什么是二叉树的深度搜索遍历,我只知道层次遍历,前序后序中序遍历啊,我想了想,感觉和后序遍历挺像的,我觉得应该就是后序遍历吧,我就先写了个后序遍历的递归写法
美团超详细面经(附答案)二三面

  1. ,然后他看了一眼,没说啥,感觉这个面试官有点话少冷淡,全程不和我互动,emmmm….下来自己百度了下,对的。。。

这个代码问完我,让后让我去等通知,我感觉回答的还行,果然没过几分钟,通知我去三面;

三面

  1. 照例自我介绍和项目介绍;
  2. 上来就让我手撕一个单例模式。。。
  3. 答:继续写我的双重锁模式
美团超详细面经(附答案)二三面

  1. 让我讲了讲代码是啥啥意思?
  2. 答:STEP 1. 线程A访问getInstance()方法,因为单例还没有实例化,所以进入了锁定块。STEP 2. 线程B访问getInstance()方法,因为单例还没有实例化,得以访问接下来代码块,而接下来代码块已经被线程1锁定。STEP 3. 线程A进入下一判断,因为单例还没有实例化,所以进行单例实例化,成功实例化后退出代码块,解除锁定。STEP 4. 线程B进入接下来代码块,锁定线程,进入下一判断,因为已经实例化,退出代码块,解除锁定。STEP 5. 线程A初始化并获取到了单例实例并返回,线程B获取了在线程A中初始化的单例。大体是这么回事。
  3. 由于我的项目中提及到JVM,所以给我出了一个场景题,垃圾会收器中,标记清除多次后,由于采用的是标记清除算法,那么你觉得可能会出现什么问题?
  4. 答:然后我说由于产生了内存碎片,所以当分配一个大对象的时候,由于内存不连续,那么会产生full GC;
  5. 这里提及到了full gc,问我,哪些情况会产生full GC,哪些情况产生minor GC?
  6. 答:minor会产生在eden区满了,fullGC产生在老年代的剩余空间不足,以及永久代内存不足也会发生fullGC。
  7. 除了你项目中的内存溢出问题,你还知道哪些关于内存溢出内存泄漏的?
  8. 答:这里之前了解过ThreadLocal,我说,ThreadLocal中的键值对中的键是一个弱引用,那么在内存回收的时候,这个键很可能会被回收掉,然后键没了,就无法找到value的值,造成了内存泄漏;
  9. 然后给我出了一个动态规划的手写代码题,说来写个代码吧,大体是在n*m的矩阵方格中,找一个最大的正方形是几乘几的,有点忘了,
  10. 答:由于没有准备过动态规划的题目,这个题目看到我只说了暴力解决的方法,然后面试官提示让我用动态规划做,我想了半天没想出来。。。。当时感觉应该是凉了。。。

时间差不多的时候,面试官说,就到这里吧,然后让我出去等通知,果然通知我今天面试结束了,整整一个下午,特别特别累,前两面结束的时候感觉特别稳,没想到最后还是因为手写代码这一块不会动态规划挂掉了,当时感觉心态有点崩。。。

作者:乔戈里
原文:转载自公号,程序员乔戈里,已获授权

本文永久链接:https://www.16175.com/17297.html

CTRL+D 快速收藏本站!成长互助,一路一起舞16175.com)!微信小程序:生涯设计网