来自:Java工程师-距离链接:my.oschina.net/u/3739863/blog/1813292我这几年一直在做Java后端技术面试官,在最近两周,我集中面试了一些初级和高级的java开发候选人。在面试过程中,我觉得我比较谨慎。只有反复确认自己的能力不够,我才会下结论。相反,如果应聘者给我的印象不错,我也会多角度去衡量,以免招到会说话不会工作的“大傻子”。其实并不是我故意刁难考生。毕竟入职后是同事,只是面试官的职责使然,有经验的面试官也是如此。写到这里,恐怕有些想面试的朋友会被吓到。强者和弱者都会被问到更多问题,那我该怎么办?这就是本文要讲的主题:如何准备Java初级和高级技术面试。1、换个角度想,如果你是面试官,你会怎么做?只能通过简历和面试来衡量,没有别的办法。如果一个大牛确认自己的能力很好,但是在面试的时候不能完全证明自己的能力,那对不起,他过不了,现实就是这样。如果面试官因为无能招了个大傻子,估计会被领导骂。并且再也不会被要求面试,更不会给领导留下好印象。因此,主观印象无法判断,但会有一些客观标准。具体来说,就是从多个方面来问一些问题,回答的好坏取决于候选人。其实有些问题是相似的,但是不同能力的面试官会有不同的切入点和提问的循序渐进的程度,有经验的面试官会挖掘候选人的优点,从候选人的花言巧语中判断候选人是否真的听懂了还是瞎扯.2.总的来说,说说准备面试的几个方面。我记得我以前参加过政治考试。某大题10分5分。每个点的标准答案不多,就一两句话。比较棘手的做法是覆盖所有点,每个点不用多说,但一定要说到点上。反之,如果你在某个点做多了,其他点都没有覆盖到,你只能为这个点拿分。同理,面试的时候要综合准备javaCore、数据库、框架、分布等方面的问题。根据我的面试结果,我发现很多应聘者走了弯路。他们可能根本就没有准备,也可能准备的方法不到位,只准备了一方面。比如只准备了算法题,这方面答的很好,其他方面一窍不通。因此,没有所谓的一定能成功的面试秘诀,但有一些准备方法可以帮助提高成功率。记住,面试前一定要做好准备,否则成功的可能性很低。准备的时候一定要综合看各个方面。至于每个点的范围,我们以后再说。3.架构方面需要准备的点初级开发,面试官需要感受以下几点。熟悉SSM架构,至少在项目中做过。这个说法是在介绍项目的时候,用一个业务流程来描述springmvc是怎么做的。了解SpringMVC中的细节,比如@Autowired的用法,如何将url映射到Controller,ModelAndView对象的返回方式等。最好结合项目的用法,说说你是如何使用AOP的和拦截器。比如可以通过拦截器拦截非法请求,如何使用AOP输出日志等等。关于ORM,你用过哪一种没有限制,但是你一定要知道一对一的用法,一对一-to-many,many-to-many等等,还有cascade和inverse的用法。了解声明式交易的做法是件好事。如果想申请高级开发,在以上的基础上,最好了解以下知识点:SpringBean的循环最好看源码,最好结合IOC的工作流程,AOP和带反射的SpringMVC。说说IOC的实现原理等,SpringBoot和SpringCloud4的一些知识点,很多考生都需要准备数据库。考生会看很多SQL技巧,比如select怎么写,insert怎么写,但仅限于此,所以不会做其他准备。这是一个劣势,因为面试官会认为即使是初级开发,也要写SQL语句,所以这块不会问太多问题,会问下面几个问题。索引是如何建立和使用的?比如我建了一个索引,如果我在where语句中写namelike'123%',会不会去索引,什么情况下不应该建索引,哪些语句不会去索引.除了索引,你在SQL优化方面有什么经验,比如分库分表,或者通过执行计划查看SQL优化点。这最好结合你正在做的项目的实际情况。在这里,经过我的面试,大约70%的应聘者只会写基本的SQL,所以即使你只有理论经验,能说说一些优化点也是非常有益的。对于高级开发,这块需要更好地理解优化技巧。5.JavaCore需要准备的点这是基础。其实,项目中问的很多问题,考生肯定会用到,但能面面俱到的很少见。这块会主要从集合、多线程、异常处理流程、JVM虚拟机等方面进行提问。在集合方面:哈希码是否已被重写?什么情况下需要重写。可能的话,结合哈希表的算法,说说hashmap的实现原理。进阶开发最好用ConcurrentHashMap来说明并发的底层实现代码。ArrayList和LinkedList的区别,比如基于数组的和基于链表的,都是线程不安全的,ArrayList的扩展方法等等,高级的还是看低级的代码.Set是如何实现防重复的,比如TreeSet和HashSet等。Collection的一些方法,比如比较方法,封装成线程安全的方法等。可能有面试者会问,如何通过ArrayList实现一个队列或者栈,这个可以准备。其实项目中并不经常用到多线程,但是会问到以下问题:synchronized锁和可重入锁的区别,然后可能顺便问一下信号量等反并发机制。如何在线程中返回值其实就是callable和runnable的区别。务必使用ThreadLocal或volatile关键字来描述线程的内存模型。在线程池方面,我知道如何使用它们。我知道一些常用参数。在线程方面,我可能会问更多关于并发机制的问题。如果是高级开发,我可能会问的更深。大致可以描述一下虚拟机的结构图和流程。您必须了解堆的垃圾回收机制。具体可以画个图说说年轻一代和老一代。说说垃圾回收的过程,再说说在代码中如何优化内存性能。最好说如果出现OOM异常,如何排查?如何查看转储文件。GC的一些概念,比如强弱软引用,finalize方法等,都可以准备好。6、算法、设计模式等其实都是很好的准备,但是这些即使没有很好的回答,能证明相关技能的项目经验一般也会pass。然而,在这方面,很多考生本末倒置。比如他们准备了算法,设计模式,刚才说的框架,没有准备数据库和JavaCore。这是很不利的,就像参加政治考试只复习一分,其他的都不准备一样。7.我对面试的感受以及听到什么样的回答可以证明应聘者更有经验。大多数候选人(约70%)没有任何准备就直接来了。要知道,面试和项目其实有点脱节。项目再好,不准备也过不去。只要确定这种人真的达不到标准,我就没有心理负担拒绝他们。谁叫他们不要准备的?也有一些考生,态度很好,明明准备充分,但准备不充分。比如前面说的,他们只准备算法,或者JavaCore方面,他们只看集合类的面试题。对于这些学生,即使他们通过了,我也会感到遗憾。毕竟面试好的话,薪水可以高一些。至于过不去的,我敢说,如果有准备,估计也不是这个结果。其实我也知道没有人是完美的。就算我一个人去面试,也不可能面面俱到。因此,我不会要求考生回答所有问题。可面试。我也和很多面试官交流过。根据我们的经验,如果应聘者能说出以下知识点,就可以证明他在这方面比较有经验。在这方面,我可能不会问太多问题。问题。架构方面,你可以证明你可以工作(不难),同时你可以结合底层代码说出IOC、AOP或者SpringMVC的流程,只要你能说出一个.或者能说出拦截器、Controllers等的高级用法。可以证明自己有SpringBoot或SpringCloud的经验,比如能说出一些SpringCloud组件的用法。最好能证明自己有分布式开发经验。其实不难证明。部署,如何通过nginx实现负载均衡等。在数据库方面,搞清楚一个问题就够了:如何进行SQL调优,比如通过索引,看执行计划。如果还有其他优化点,说明清楚即可。下面是JavaCore的一些技巧:结合ConcurrentHashMap的源码,讲述final、volatile、transient的用法,以及如何使用Lock对象来防止并发写入。下面结合一个项目的实际,谈谈设计模式的实践。多线程方面,可以说说Lock或者volatile等高级知识点的用法。这块是最棘手的:讲GC过程,以及如何通过日志和dump文件排查OOM异常。如果再高级一点,在代码中讲讲内存代码如何优化。逆风启笔是一个专注于程序员圈子的技术平台。你可以获得最新的技术动态、最新的内测资格、BAT等大厂的经验、自我成长、学习资料、职业路径等,微信搜索倪峰开始写作关注!
