引言
找学姐内推的美团后台开发岗位。刚投两天就收到了面试通知,相当猝不及防。本文主要是记录一些面试题目,面试题相关的知识在网上大多都查得到,我就写得稍微简略一点。凡是文中用引号(“”)标记的文字都是我当时的回答,其他内容则是我的一些补充。
面试官形象
一面:视频面试,在牛客网的一个非常专业的面试平台上,旁边就有代码框可以写代码给面试官看。男面试官,问的问题都偏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 -H。ps xH也能查看系统中所有的线程。
面试官接着问:“造成这种现象的原因可能是什么呢?”
我:“有可能是程序中有死循环,或者线程数过多。”
8.Java的线程池有用过吗?
我回答说“用过,比如SingleThreadExecutor,CachedThreadPool,FixedThreadPool等等。”
面试官:这都是一些工厂方法,他们实际生产的是什么对象以及这个类的构造方法的参数有了解吗?
我:“不了解。”
后来去网上查了一查:
其实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对象中呢?
答:“感觉用数据库更加可靠一点吧。”
23.你以前实习的时候有没有遇到什么困难?你是怎么解决的?
24.看你简历里写Hadoop,Mapreduce这些东西实际中有使用过吗?还是说只是学学了相关知识
我说“我只是学了学相关知识。”
25.Hadoop,Mapreduce在什么场景下使用呢?
答:“在企业大数据处理的时候使用”
26.假如有一个很大的文件里面全是数字,你要对其进行排序,你要怎么做呢?提示你可以借鉴mapreduce的思想
当时随口说了一个方案,感觉也不太对:“先分块快排,然后再进行归并排序”。
27.Zookeeper有哪些应用场景呢?
答:“集中管理配置文件,或者分布式锁。”
28.假如让你实现一个可以递增的id,你要怎么实现?
我说“可以使用数据库事先生成好”,然后面试官说如果不用数据库呢?我回答说“可以用Redis解决”,面试官又问:Zookeeper可以实现吗?我说“不知道,没有用Zookeeper搞过。”,面试官说:可以用Zookeeper实现的(后来我去网上搜了一下,确实是Zookeeper很经典的用法)
29.还有什么问题想问我的?
答:“暂时没有”
这个地方建议大家还是问一下,比如向他请教一下之前他问的问题的答案,可能这样会给面试官留下更好的印象。
30.你能实习多久?一周能来几天
答:“我能实习将近一年,一周能来5天”
31.一周能来五天?你们不用上课吗?
答:“有课,下学期没课。”
面试官说:“那你是到暑假才能来了?”
我说“是的。”
32.等HR给你进一步的通知吧
转载自 https://blog.52xintaidu.com/java/1531.html?tdsourcetag=s_pcqq_aiomsg