引言
其实原本真的没打算写这篇文章,主要是记忆力不是很好,不像一些记忆力强的人,面试完之后,几乎能把本身和面试官的对话都给记下来。本身当初面试完之后,除了记住一些聊过的知识点之外,具体的内容基本上忘得一干二净,因此写这篇文章实际上是颇有难度的。java
可是,最近问的人实在是太多了,为了不重复回答,给本身省点力气,干脆就在这里统一回复了。面试
第一个问题:阿里面试都问什么?
这个是让我最头疼的一个问题,也是群里的猿友们问的最多的一个问题。算法
说实话,我只能隐约想起并发、JVM、分布式、TCP/IP协议这些个关键字,具体的问题真的是几乎都没记住。并且就算我记住了,也告诉你了,你也背会了,但我以为,在面试中,你被问到如出一辙问题的可能性依然很小。设计模式
甚至,就算你运气好被问到了,你也照着背下来了,也不必定就能对你的面试起到正面的做用,由于面试官万一多问一句,你可能就露馅了,那还不如干脆点说不会更好。网络
我参加的是阿里的社招面试,而社招不一样于校招,问题的范围实际上是很随机的。由于能参加一些比较知名的互联网公司社招的人,70%以上都会有个3-5年的经验。这倒不是说一两年经验的同窗没有机会进这些公司,而是由于这种公司,大部分状况下只招一些比较资深的开发和应届生,而不招那些处于中间阶段的人。而1-2年经验的同窗,每每就恰好处于这个尴尬的阶段。数据结构
对于能有3-5年经验的这部分人中,每一个人的经历又都不一样,所擅长的点也不同,所以这就会致使每一个人的问题和范围都不太同样。架构
不多说有哪一个知名的互联网公司,好比BAT、京东、360、搜狐、网易等这些公司,其社招面试还有固定的问题和模式,让你能够像应届生面试同样,在面试前靠临时抱佛脚度过这一关。并发
大部分公司在社招的时候,不光是阿里,其它公司也都同样(由于我在一年多前也参加过不少其它知名互联网公司的面试,详情见《记录2015年年初跳槽的经历!》,基本上都分为两个阶段的提问。框架
第一个阶段是主语言自己以及它的高级特性,第二个阶段是讲述本身的项目,并在中间穿插着问题。分布式
因此,不妨就这两个阶段,谈谈社招面试的准备,而不是去把阿里面试的过程背一遍。说实话,我也确实记不住,因此不要再问我阿里面试都会问哪些问题了,你看看上面那个链接里的文章,也会发现,里面也基本上没有写具体的问题,缘由是同样的,真的记不住啊。
第二个问题:社招面试如何准备
我会分为四个部分来谈论这个问题,因为我自己是Java出身,所以关于主语言的问题,都是与Java相关,其它语言的同窗能够选择性忽略。此外,面试的时候通常面试官的问题都是环环相扣,逐渐深刻的,这点在下面你们能够更明显的感觉出来。
一、主语言自己以及它的高级特性。
主语言固然就是你平日里拿来赚钱的家伙。不要告诉我你没有主语言,你会N多种语言,或者是你精通N多种语言,你要非这么说的话,你能够来杭州试试,我保证不打死你,最多打残。
个人主语言很显然是Java,那么对于Java来讲,它的语言自己以及它的高级特性,都有哪些比较容易在面试中问到呢?
通常状况下,主要有如下知识点很容易被问到。(PS:如下所列举的,都是一些Java相对而言比较高级一点的知识点,由于这里谈的是社招,而不是校招)
1)Java的数据结构相关的类实现原理,好比LinkedList,ArrayList,HashMap,TreeMap这一类的。如下简单模拟一个数据结构的连环炮。
好比,面试官先问你HashMap是否是有序的?
你确定回答说,不是有序的。那面试官就会继续问你,有没有有顺序的Map实现类?
你若是这个时候说不知道的话,那这个问题就到此结束了。若是你说有TreeMap和LinkedHashMap。
那么面试官接下来就可能会问你,TreeMap和LinkedHashMap是如何保证它的顺序的?
若是你回答不上来,那么到此为止。若是你依然回答上来了,那么面试官还会继续问你,你以为它们两个哪一个的有序实现比较好?
若是你依然能够回答的话,那么面试官会继续问你,你以为还有没有比它更好或者更高效的实现方式?
若是你还能说出来的话,那么就你所说的实现方式确定依然能够问你不少问题。
以上就是一个面试官一步一步提问的例子。因此,若是你了解的很少,千万不要敷衍,由于可能下一个问题你就暴露了,还不如直接说不会,把这个问题结束掉,赶忙切换到你熟悉的领域。
2)Java并发包当中的类,它们都有哪些做用,以及它们的实现原理,这些类就是java.concurrent包下面的。与上面同样,我们也简单的模拟一个并发包的连环炮。
好比面试官可能会先问你,若是想实现全部的线程一块儿等待某个事件的发生,当某个事件发生时,全部线程一块儿开始往下执行的话,有什么好的办法吗?
这个时候你可能会说能够用栅栏(Java的并发包中的CyclicBarrier),那么面试官就会继续问你,你知道它的实现原理吗?
若是你继续回答的话,面试官可能会继续问你,你还知道其它的实现方式吗?
若是你还能说出不少种实现方式的话,那么继续问你,你以为这些方式里哪一个方式更好?
若是你说出来某一个方式比较好的话,面试官依然能够继续问你,那若是让你来写的话,你以为还有比它更好的实现方式吗?
若是你这个时候依然能够说出来你本身更好的实现方式,那么面试官确定还会揪着这个继续问你。
为何说面试的时候要引导面试官,缘由就在这了。由于面试官的提问不少时候都是有迹可循的,你若是抓住了他的轨迹,可以猜到他下面极可能会问什么,那你在回答的时候就能够往你想要谈的方向去说。这样面试时就会显得更加从容,更加的游刃有余。
3)IO包和NIO包中的内容。这部分里面NIO会是重点,IO包大部分都会比较熟悉,所以可能会直接略过,直接问你NIO的内容。
IO包和NIO包的内容相对来讲不是不少,首先NIO模型要熟悉,特别是其中的selector必定要很是清楚它的职责和实现原理。其实NIO的核心是IO线程池,必定要记住这个关键点。有的时候,面试官可能也会问你IO包的设计模式(装饰器模式),为何要这样设计?
有的面试官还会问你有没有更好的设计,这个时候若是你不知道请果断说本身如今的水平有限,想不出来更好的设计,千万不要信口开河,随意YY。
4)Java的虚拟机的内容。这部分主要包括三部分,GC、类加载机制,以及内存。
一个GC部分简单的连环炮。
面试官能够先问你何时一个对象会被GC?
接着继续问你为何要在这种时候对象才会被GC?
接着继续问你GC策略都有哪些分类?
你若是说出来了,继续问你这些策略分别都有什么优劣势?都适用于什么场景?
你继续说出来了之后,给你举个实际的场景,让你选择一个GC策略?
你若是选出来了,继续问你,为何要选择这个策略?
下面是关于类加载机制的简单连环炮。
首先确定是先问你Java的类加载器都有哪些?
回答了这些之后,可能会问你每一个类加载器都加载哪些类?
说完之后,可能会问你这些类加载之间的父子关系是怎样的?
你在回答的时候可能会提到双亲委派模型,那么能够继续问你什么是双亲委派模型?
你解释完了之后,可能会继续问你,为何Java的类加载器要使用双亲委派模型?
你回答完之后,可能会继续问你如何自定义本身的类加载器,本身的类加载器和Java自带的类加载器关系如何处理?
再来一个关于内存的连环炮。
首先确定就是问你内存分为哪几部分,这些部分分别都存储哪些数据?
而后继续问你一个对象从建立到销毁都是怎么在这些部分里存活和转移的?
接着可能会问你,内存的哪些部分会参与GC的回收?
完事之后,可能还会问你Java的内存模型是怎么设计的?
你回答了之后,还会继续问你为何要这么设计?
问完之后,还可能会让你结合内存模型的设计谈谈volatile关键字的做用?
你在谈的时候,确定会提到可见性,那么接着可见性这三个字,还能够继续问你并发的内容。
基本上Java语言自己以及语言稍微高级点的内容就是以上部分,若是你能把以上四部分了解的很是透彻,那基本上Java这部分就没啥问题了,由于光以上的内容就够你跟面试官聊好久了。你聊这些聊得久了,天然问你其它问题的时间就会短点。
你从LZ写这些问题的过程也应该能感觉出来,不少时候,面试官都是顺着一条线一路问下去的,若是你以为这条线你不熟悉的话,就要及时拐弯,引导面试官去问其它方面的问题。千万不要一直往下深刻,直到本身跳不出来为止,那就尴了个尬了。
二、讲述本身的项目,并在中间穿插着问题
这一部分是面试过程当中必问,也是聊得最久的一个阶段。除非你前面的语言部分很是扎实,扎实到面试官问了一两个小时,依旧没有探出你对语言自己的了解到底有多深。不然的话,你必定逃不过本身的项目这一关,并且通常状况下聊得时间不会过短。
这一部份内容,通常的模式就是你本身去讲你作过的项目,而后面试官会冷不丁的让你去解释其中某一部分,好比让你解释当时为何要这么作,或者问你如今以为有没有更好的办法。而这些穿插的问题,大部分与你的项目所用到的技术有关。而你须要作的,就是充分、再充分的去总结本身作过的项目(尤为是最近的一两个项目),挖掘出一个甚至N个亮点,以备于到时候可让面试官产生眼前一亮的感受。若是你能达到这种效果的话,基本上离你成功就不远了。
三、额外的加分项
上面两个阶段基本上是必问的,还有一些加分项。这些加分项中,有些内容面试官也会问你(好比TCP/IP协议、算法),但更多的是会先问你了解不了解,你了解的话再继续聊,不了解的话就直接略过了,不至于由于这种问题而直接把你打入地狱。
下面我列举一下这些加分项,若是能够的话,这些加分项仍是要争取一下的。
网络通讯协议(TCP/IP,HTTP等)。
数据结构与算法。
著名开源项目的源码。
你本身有很棒的开源项目。
你的我的博客。
待评论区补充。
这几项当中,对于前1-3项,若是你以前就比较了解,只是因为时间问题忘记了的话,仍是能够临时抱佛脚一下的。至于后面4-6项,就须要你平常的积累了,不是一时半会儿能作到的。若是你平日里没有积累,那么后面这三个加分项只能抛弃了。
四、与你职位相关的内容
其实这最后一项是对前面三项的补充,你应该尽可能去主攻和你面试的职位相关的内容。好比你面试一个实时计算的职位,那么你的算法最好要厉害,对于著名的实时计算开源项目要熟悉,最好阅读过源码,并且还要对分布式系统有必定的看法。
所以,这个第4部分没有具体的内容,只是提醒你,若是你很明确本身的面试职位,最好在面试前准备的时候,尽可能朝职位的需求方向靠拢,这样成功的可能性更大。
最后若是你正在跳槽和面试的话,我这里也整理了一些bat大厂的面试真题和架构进阶视频的录播
须要的能够加群714827309获取架构资料 点击连接加入群聊【JAVA高级架构技术交流】:https://jq.qq.com/?_wv=1027&k...
注:加群要求
一、具备1-5工做经验的,面对目前流行的技术不知从何下手,须要突破技术瓶颈的能够加。
二、在公司待久了,过得很安逸,但跳槽时面试碰壁。须要在短期内进修、跳槽拿高薪的能够加。
三、若是没有工做经验,但基础很是扎实,对java工做机制,经常使用设计思想,经常使用java开发框架掌握熟练的,能够加。
四、以为本身很牛B,通常需求都能搞定。可是所学的知识点没有系统化,很难在技术领域继续突破的能够加。
5.阿里Java高级大牛直播讲解知识点,分享知识,多年工做经验的梳理和总结,带着你们全面、科学地创建本身的技术体系和技术认知!