美团内推面试记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33256688/article/details/79665412

引言


  找学姐内推的美团后台开发岗位。刚投两天就收到了面试通知,相当猝不及防。本文主要是记录一些面试题目,面试题相关的知识在网上大多都查得到,我就写得稍微简略一点。凡是文中用引号(“”)标记的文字都是我当时的回答,其他内容则是我的一些补充。

面试官形象


  一面:视频面试,在牛客网的一个非常专业的面试平台上,旁边就有代码框可以写代码给面试官看。男面试官,问的问题都偏java与计算机基础(基础是相对于项目而言),不像阿里上来就聊好久项目,然后才问一些知识,美团则是上来先问基础知识 ,问了好久基础知识才讲一点项目。

一面


总体感觉

  问得挺细,不过大多数问题都是挺经典的,提前复习复习基本都能复习到。

1.自我介绍

  自我介绍结束之后,面试官说那就先从你简历里写的专业技能问起吧(我简历中专业技能第一项写的是熟悉Java,然后他就先从java问起)。

2.说说你在实习过程中干了什么?

3.ConcurrentMap相比以前的Map有哪些改进?

  答:“CocurrentMap采用了分段式锁,以前的Map都是由Entry链表组成,而ConcurrentMap先将Entry分成一个个Segment,然后再由Segment组成Map,每次写的时候就只需要锁住一个Segment就可以了,因此提高了性能。”

4.HashMap有哪些缺点?

  答:“线程不安全”

5.你说HashMap是线程不安全的,那么有哪些情况会造成问题呢?

  答:“当两个线程同时对HashMap进行ReSize的时候可能会产生环链。”

6.Java中会发生内存溢出吗?

  答:“会发生。如果某个Java对象一直被保存在集合中忘记清除,就会导致引用一直不被释放,产生内存溢出。记得Java中有一个WeakHashMap,能够保存对象的弱引用,这样程序中不再使用对象之后,也会在Map中被自动清除。”

7.如果发现Java程序的CPU负载特别高,你会用什么工具进行分析和调试呢?

  答:“Jconsole或者Jvisualvm,还有linux中自带的top命令。”
  然后面试官接着追问:“linux中好像有参数能够查看线程的内存占用,你知道是什么吗?”
  我:“不知道。”
  后来去网上查了查:查看线程的内存与CPU占用的命令是top -Hps xH也能查看系统中所有的线程。
  面试官接着问:“造成这种现象的原因可能是什么呢?”
  我:“有可能是程序中有死循环,或者线程数过多。”

8.Java的线程池有用过吗?

  我回答说“用过,比如 SingleThreadExecutor,CachedThreadPool,FixedThreadPool等等。”
  面试官:这都是一些工厂方法,他们实际生产的是什么对象以及这个类的构造方法的参数有了解吗?
  我:“不了解。”

后来去网上查了一查:

扫描二维码关注公众号,回复: 3373282 查看本文章

  其实Executors工厂中生成的这些线程池最终都是用不同的参数构造了ThreadPoolExecutor对象,ThreadPoolExecutor类的构造方法中有
corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory和handler这几个参数,含义如下:

  • corePoolSize:核心池的大小。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务;
  • maximumPoolSize:线程池最大线程数,它表示在线程池中最多能创建多少个线程;
  • keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize,即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;
  • unit:参数keepAliveTime的时间单位
  • workQueue:一个阻塞队列,用来存储等待执行的任务;
  • threadFactory:线程工厂,主要用来创建线程;
  • handler:表示当拒绝处理任务时的策略,有以下四种取值:
1.ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 
2.ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。 
3.ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
4.ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

9.说说看Java的堆空间是怎么分配的?

  答:“分为新生代,老年代与永久代。”

10.JVM的那些启动参数有了解过吗?-Xms是代表什么呢?JVM的最大堆内存与最小堆内存容量默认是一样的,这是为什么呢?

  答:“了解过,但是参数名称我都忘了。”

后来去网上查了一查:
  -Xms参数用来配置初始堆,-Xmx用来配置最大堆,它们的默认值都是3550M,之所以将他们设置为一样是为了避免每次垃圾回收完之后JVM都重新分配一次内存。

9.新生代内部的空间是怎么分配的?Eden Space占百分之多少?

  答:“分为Eden Space与Survivor Space。Eden Space占了百分之八十。”

11.新生代的垃圾回收和老年代的垃圾回收有什么区别?

  答:“一个叫Minor GC,一个叫Major GC。用的算法不同,一个用的是“复制算法”,一个用的是“标记整理”算法。”

12.写个单例模式给我看看?

  然后我就默写了标准的懒汉模式的单例模式代码,加了双重锁定。

13.说说看你了解哪些git命令?git rebase了解吗?

  答:“比如git clone,git pull,git push。不知道git rebase。”

后来去网上查了查:
  git rebase其实就是一个用于分支合并的命令,以前我通常都用git merge来合并分支,其实git rebase相比git merge更能够保持工作树的整洁。

14.maven的依赖加载顺序是什么?

  我说“我只是会用maven,原理不清楚。”

之后去网上查了一查:
  查了之后才突然明白过来,面试官并没想刁难我,只是我当时没有弄清题意,只要像下面那样简单地回答就可以了:
1. 先在本地仓库中搜索;
2. 如果在本地仓库中没有搜索到的话,maven会去中央仓库中搜索,如果搜索到则将其下载到本地仓库留以后使用;如果没有搜索到的话,则maven会看一看在pom中有没有声明远程仓库(远程仓库是指用户自定义仓库),如果没有声明则报错;否则的话进行下一步;
3. 在远程仓库中搜索依赖,如果搜索到的话则下载到本地供以后使用,否则报错;

15.写个sql看看,查询student表中分数大于80的学生

  见我的另一篇博客:积累一些常见的写SQL的题,其中的第一题。

16.再写个sql,查询student表中分数排名第二的学生,最好能考虑学生考试成绩并列的情况。

  见我的另一篇博客:积累一些常见的写SQL的题,其中的第二题。

17.来写个linux命令吧,某个文件在不断地更新,我要实时查看更新的内容中包含”北京”字段的行

  答:”tail -F | grep 北京”

18.来写个算法的代码,就二分查找吧

19.你写的二分查找代码是不是没有考虑重复的数字,如果有重复的数字怎么办?

  答:“没有考虑,不知道怎么办。”

20.讲讲看你从浏览器中输入网址到看到网页之间发生了什么?

  答:“网址先经过DNS解析变成IP地址,然后浏览器向服务器发起HTTP请求,请求回网页然后渲染到了浏览器上。”

  注:感觉我这里答得太粗略了,大家可以去网上看看更详细的解答。

21.讲讲你在项目中遇到的困难是怎么解决的?

  这个问题在各种面试中都会经常遇到,建议大家好好回顾一下之前做过的项目,将其中的一些比较上档次(就是比较不会让人觉得low)的困难整理出来,想想看如何能将其描述得绘声绘色。

22.为什么用Redis而不直接存在java对象中呢?

  答:“感觉用数据库更加可靠一点吧。”
  当时一时没想到怎么答,所以回答得比较粗略,稍微正式一点的回答是:数据放在Redis中可靠性更好,而且当数据在单机中存放不下时,Redis的集群模式可以存放更多的数据。

23.你以前实习的时候有没有遇到什么困难?你是怎么解决的?

24.看你简历里写Hadoop,Mapreduce这些东西实际中有使用过吗?还是说只是学学了相关知识

  我说“我只是学了学相关知识。”

25.Hadoop,Mapreduce在什么场景下使用呢?

  答:“在企业大数据处理的时候使用”

26.假如有一个很大的文件里面全是数字,你要对其进行排序,你要怎么做呢?提示你可以借鉴mapreduce的思想

  当时随口说了一个方案,感觉也不太对:“先分块快排,然后再进行归并排序”。

27.Zookeeper有哪些应用场景呢?

  答:“集中管理配置文件,或者分布式锁。”

28.假如让你实现一个可以递增的id,你要怎么实现?

  我说“可以使用数据库事先生成好”,然后面试官说如果不用数据库呢?我回答说“可以用Redis解决”,面试官又问:Zookeeper可以实现吗?我说“不知道,没有用Zookeeper搞过。”,面试官说:可以用Zookeeper实现的(后来我去网上搜了一下,确实是Zookeeper很经典的用法)

29.还有什么问题想问我的?

  答:“暂时没有”

  这个地方建议大家还是问一下,比如向他请教一下之前他问的问题的答案,可能这样会给面试官留下更好的印象。

30.你能实习多久?一周能来几天

  答:“我能实习将近一年,一周能来5天”

31.一周能来五天?你们不用上课吗?

  答:“有课,下学期没课。”
  面试官说:“那你是到暑假才能来了?”
  我说“是的。”

32.等HR给你进一步的通知吧

猜你喜欢

转载自blog.csdn.net/qq_33256688/article/details/79665412