上周集中面试了几位3~5年工作经验的Java后端应聘者。我的标准其实并不复杂:第一,能干,第二,Java基础好,第三,最熟悉一些分布式框架。我相信其他公司在招聘初级开发人员时,也应该遵循这个标准。我也知道很多应聘者能力不差,但是在面试的时候没有准备好或者不知道怎么说话。这样的人在加入团队后可能确实达到了他们的期望,但他们可能无法通过面试,但面试官总是只根据面试情况来判断。但现实情况是,大部分人在面试前可能没有做好准备,或者准备方法不合适。要知道我们平时的工作更多的是面向业务,不可能接触到算法、数据结构、底层代码等大量面试必问的问题。作为面试官,我只能根据应聘者的回答来决定面试的结果。但是,你和别人交流起来很方便,所以在这篇文章中,我将通过一些常用的问题来介绍面试的准备技巧。看完之后大家肯定会感叹:只要方法得当,准备面试并不难,第二次也不会花太多时间。不要让人觉得你只会抄别人的代码框架才是重点,但也不要让人觉得你只会抄别人的代码!面试前,我会阅读简历,查看应聘者在框架中的项目经历。在项目介绍环节,我也会着重介绍候选人最近的框架经验。目前比较流行的是SSM。但是,工作5年以内的应聘者,大多只能“复制”别人的代码,也就是说,可以在现有框架的基础上扩展新的功能模块,按照别人写的流程走。比如你要写一个股票挂单的功能模块,你会模仿现有的下单流程,然后从前端到后端再到数据库,用同样的方式写,顶多改一下代码与功能相关的点。其实我们每个人都是这样走过来的,但是在面试的时候,如果你只是表现出这样的能力,那你就和大多数人处于一个水平,你就无法在这一点上表现出你的优势。我们知道如果单纯的使用SSM框架,大部分项目都会有痛点。比如数据库性能差,或者业务模块复杂,并发比较高。使用SpringMVC中的Controller无法满足跳转要求。所以我一般会主动问:除了按照现有的框架写业务代码外,你们还有哪些改动?我听到的答案是:增加Redis缓存,避免频繁调用一些不变的数据。或者,在MyBitas的xml中,select语句的where条件有isnull,即如果value存在,则增加一个where条件。为此,会在任意where处加上一个不带isnull的查询条件,防止传入参数时语句无效,当为null时,进行全表扫描。或者简单的说,后端异步返回的数据量大,时间很长。在项目中,我增加了异步返回的最大时间,或者对返回信息进行了压缩,以提高网络传输性能。对于这个问题,我不在乎我听到的答案是什么,我只在乎这个答案是不是合乎逻辑的。一般只要回答正确,我就会给出“我在框架层面有自己的经验,有一定的了解”,否则,我只会给出“我只能在项目经理的带领下写框架代码”,而且我对框架本身了解不多。””。其实在准备面试的时候,总结框架中的要点并不难,我不相信大家在做项目的时候什么都没有积累,只要你说出来,就可以说你在这方面碾压了将近70%的竞争对手,靠。单机版够用吗?适当了解一些distribution,不要只看单机版的框架,要适当了解一些distribution!另外,在项目中描述框架技术的时候,最好带上一些分布式的技术,下面我列举了一些大家可以准备的分布式技术。1.反向代理方面,nginx的基本配置,比如比如如何通过lua语言设置规则,如何设置sessionstickiness。有条件的话看nginx底层,比如协议,集群设置,failover等2.远程调用dubbo方面,可以看dubbo的知识点和zookeeper集成,再进一步了解dubbo的底层传输协议和序列化方式。3.消息队列方面,可以看看kafka或者任何一个组件是怎么用的。为简单起见,您可以查看配置和工作组设置。再深入的话,可以看看Kafka集群,持久化的方式,消息的发送方式。使用长连接或短拦截。以上只是三个组件的示例。也可以看看Redis缓存、日志框架、MyCAT分库分表等,准备方式有两种。首先是要知道如何使用它。这个比较简单。可以通过配置文件将其构建成一个功能模块。二是阅读一些底层代码,了解协议。集群和故障转移等高级主题。如果能在面试中讲分布式组件底层,会得到更好的评价,比如“了解框架底层”或者“对框架有经验”,所以即使去面试架构师,它甚至更好。更不用说高级开发了。不要只知道增删改查,要懂性能优化数据库,不要只知道增删改查,要懂性能优化!在实际项目中,大多数程序员可能只会使用增删改查。当我们使用Mybatis时,这是比较常见的。但是如果你在面试的时候有这样的表现,估计你的能力和其他竞争者差不多。对此,你可以准备以下技巧:1、SQL高级方面,如groupby、having、leftjoin、子查询(within)、rowtocolumn等高级用法。2、在建表方面,可以考虑你的项目是否使用了三种范式或反范式,原因是什么?3、尤其是优化,可以准备如何通过执行计划检查SQL语句的改进点,或者其他可以提高SQL性能的方法(比如索引等)。4.如果觉得自己有能力,也可以准备一些MySQL集群,MyCAT分库分表的技巧。比如MySQL的负载均衡就是通过LVS+Keepalived实现的,MyCAT的配置方式。另外,如果可以,请查看一些相关的低级代码。就算你前三点表现一般,但你至少可以超过平均水平的候选人,尤其是你在SQL优化方面表现非常出色,那么在面试高级开发的时候,数据库水平一定要达标。四点回答的也很好,那么恭喜你,你在数据库方面的能力甚至达到了初级架构的水平。围绕数据结构和性能优化Java核心方面准备面试题,围绕数据结构和性能优化准备面试题!Java核心,网上有很多面试题,但是除此之外,你还要关注集合(也就是数据结构)和多线程并发,在此基础上可以准备一些关于设计模式和虚拟机的花言巧语.下面是我经常问的一些问题:Stringa="123";字符串b="123";a==b的结果是什么?这里面包括内存、String的存储方式等很多知识点。HashMap中的hashcode方法和equal方法什么时候需要重写?如果没有,后果是什么?您可以了解更多有关HashMap(甚至是ConcurrentHashMap)的底层实现。ArrayList和LinkedList的底层实现有什么区别?它们适用于哪些场合?您还可以了解底层代码。volatile关键字的作用是什么?从这里就可以理解线程内存和堆内存的区别了。CompletableFuture,这是JDK1.8的新特性,如何通过它实现多线程并发控制呢?在JVM中,新对象位于哪个区域?再深入一点,问一下如何查看和优化JVM虚拟机的内存。Java的静态代理和动态代理有什么区别?***结合底层代码。通过以上的问题点,我其实并没有仅仅停留在“有用”的层面,比如我不去问ArrayList怎么放元素。可以看到,上面的问题包括“多线程并发”、“JVM优化”、“数据结构对象底层代码”等细节。我们知道现在的Java开发主要是基于Web框架的,那为什么要问Java的核心知识呢?我对此有亲身经历。之前在我的团队里遇到过两个人,一个是能干,具体表现是会用Java的核心基础API,而且没有意愿去深入学习(不知道怎么学)moreaboutit),另一个是平时看一些Java并发和虚拟机的进阶知识。半年后,后者的能力迅速升级为高级开发。由于对JAVA的核心知识点了解的比较透彻,所以看一些分布式组件的底层实现问题不大。而前者则一直在重复劳动,能力仅停留在“能干活”的水平。在真正的面试中,如果不熟悉Java的核心知识,估计很难晋升到高级开发,更别说面试架构师级别的职位了。至少知道怎么看日志排查问题Linux,至少知道怎么看日志排查问题!如果应聘者能证明自己有“排查问题”和“解决问题”的能力,这绝对是加分项,但如何证明呢?大部分互联网项目都是部署在linux上的,也就是说日志都是在linux上的,下面总结一些linux的实际操作。1、可以使用less命令打开文件,使用Shift+G到达文件底部,然后使用?+关键字根据key查找信息。2.关键字可以用grep搜索,具体用法是,grep关键字文件名,如果要在结果中搜索两次,使用grep关键字1文件名|关键词2——颜色。***--颜色是一个突出显示的关键字。3.可以通过vi编辑文件。4、可以通过chmod设置文件的权限。当然,实用的Linux命令越来越多,但在实际面试过程中,很多应聘者连一条Linux命令都不会。再一次,即使你知道一些非常基本的东西,你也比一般人好。通读一段底层代码,作为加分项,你怎么证明你对一个知识点理解的很好?没有什么比能够通过底层代码来解释它更好的了。和很多有5年以内工作经验的程序员交流的时候,很多人觉得很难?确实,如果想通过阅读底层代码来理解分布式组件,并不容易,但是如果底层代码不难理解。1、ArrayList和LinkedList的底层代码包含了基于数组和链表的实现方法。如果能把展开、“枚举数遍历”等方法解释清楚,绝对可以证明自己。2、HashMap直接对应Hash表的数据结构。在HashMap的底层代码中,包含了hashcode的put、get等操作,甚至在ConcurrentHashMap中,也包含了Lock的逻辑。相信如果在面试的时候多看一眼ConcurrentHashMap,再结合纸上谈兵画画,一定能征服面试官。3.可以看看静态代理和动态代理的实现,再深入一点,可以看看SpringAOP中的实现代码。4.或许SpirngIOC和MVC的底层实现代码比较难理解,但是可以讲一些关键的类,按照关键流程讲一下它们的实现方法。其实不需要准备很多底层代码,不限于任何方面。比如集合中基于红黑树的TreeSet,基于NIO的开源框架,甚至分布式组件的Dubbo都可以编写。而且准备的时候不需要把底层全部背一遍(其实很难做到),只要能结合一些重要的类和方法,把自己的思路说清楚(比如解释一下HashMap是如何快速实现的)通过hashCode定位)。那么在面试的时候,如何找一个好的机会说出自己准备的上述底层代码呢?面试的时候总会问到集合、SpringMVC框架等相关知识点。当你回答的时候,顺便说一句“我这块的底层实现我还是懂的”,那面试官肯定会问,然后你就说出来了。不要小看这对考生的帮助。一旦说出来,只要意思到位,至少能得到“正面、专业”的评价。如果描述的很清楚,那么评价就会升级为“熟悉Java核心技能(或SpringMVC),基本功扎实”。要知道,在面试中,很少有人能把底层代码解释清楚,所以如果你提出这个话题,即使hack没有达到预期的效果,面试官也不会因此而降低你的评价。所以,准备这块绝对是“百利而无一害”的赚钱生意。将以上技能嵌入到你做过的项目中Everything,将以上技能嵌入到你做过的项目中!面试过程中经常听到一些遗憾的回答,比如应聘者的SQL优化技巧他说的头头是道,但是***了解到这是他自学时掌握的,并没有在实际项目中使用.当然聊胜于无,所以我会写下“平时自学过SQL优化技巧”,但如果在项目中实践过,那我会写下“有实际的数据库SQL优化技巧”.大家可以对比一下两者的区别,一个是理论为主,一个是直接能干活。其实在很多场景下,我不认为SQL优化技巧一定不能在实际项目中实践。从这个案例中,我想告诉你的是,你之前辛辛苦苦准备的很多技巧和说辞(其实不需要花费太多的精力去搞定方法方向)最终应该是在你的实际项目中实现。里面。比如你有在Linux日志中查询关键词排查问题的经验,你可以在描述中加上一句话,我在之前的项目中就是这样做的。再比如,如果你通过查看底层代码了解了TreeSet和HashSet的区别和适用范围,那么你就可以回忆一下你之前做过的项目。有没有只适用于TreeSet的场景?如果是,那你就可以适当的描述一下项目的需求,然后说,通过阅读底层代码,我明白了两者的区别,而在这个实际需求中,我使用了TreeSet,我也做了一个对比实验,并发现使用TreeSet与HashSet相比要高xx个百分点。请记住,“实践经验”一定比“理论经验”更有价值,而且你所知道的大部分理论经验一定都用在了你的项目中。所以,如果只是让面试官觉得你只有“理论经验”,那就太糟糕了。摘要:本文详细讲述了准备面试的方法。本文给出的面试题不多,但本文无意给出过多的面试题。从这篇文章中,你能看到的更多的是面试官发现的很多应聘者的痛点。这篇文章的目的是为了防止大家重蹈别人的覆辙。这篇文章也给出了很多准备面试的方法。你的能力可能比别人强,但是如果你准备面试的方式和别人差不多,或者只是拿你在项目中所做的工作举例而不是总结你在项目中的亮点,那么面试官真的会看不起你。
