在上周,密集面试了若干位Java后端的候选人,工作经验在3到5年间。我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面的。

我也知道,不少候选人能力其实不差,但面试时没准备或不会说,这样的人可能在进团队干活后确实能达到期望,但可能就无法通过面试,但面试官总是只根据面试情况来判断。

但现实情况是,大多数人可能面试前没准备,或准备方法不得当。要知道,我们平时干活更偏重于业务,不可能大量接触到算法,数据结构,底层代码这类面试必问的问题点,换句话说,面试准备点和平时工作要点匹配度很小。

作为面试官,我只能根据候选人的回答来决定面试结果。不过,与人方便自己方便,所以我在本文里,将通过一些常用的问题来介绍面试的准备技巧。

大家在看后一定会感叹:只要方法得当,准备面试第一不难,第二用的时间也不会太多。

个人任务只要你能从零把一个项目搭建起来,能运行在服务器上。用上的技术还不烂,那我认为就可以找到Java的工作了。

限于文章篇幅,博主已经讲文中的各种面试题以及各种知识点进行了分类整合打包(里面包含了:Spring、Spring boot、Spring MVC、MyBatis、MySQL、JVM等各种刚需知识点)

  • 如果有需要的面试题的朋友欢迎进入交流群:1149778920 来免费获取 群暗号:qf

以下是部分资料截图:

一、框架是重点,但别让人感觉你只会山寨别人的代码

**在面试前,我会阅读简历以查看候选人在框架方面的项目经验,在候选人的项目介绍的环节,我也会着重关注候选人最近的框架经验,目前比较热门的是SSM。
不过,一般工作在5年内的候选人,大多仅仅是能“山寨”别人的代码,也就是说能在现有框架的基础上,照着别人写的流程,扩展出新的功能模块。比如要写个股票挂单的功能模块,是会模仿现有的下单流程,然后从前端到后端再到数据库,依样画葫芦写一遍,最多把功能相关的代码点改掉。 **

其实我们每个人都这样过来的,但在面试时,如果你仅仅表现出这样的能力,就和大多数人的水平差不多了,在这点就没法体现出你的优势了。

我们知道,如果单纯使用SSM框架,大多数项目都会有痛点。比如数据库性能差,或者业务模块比较复杂,并发量比较高,用Spring MVC里的Controller无法满足跳转的需求。所以我一般还会主动问:你除了依照现有框架写业务代码时,还做了哪些改动?

我听到的回答有:
增加了Redis缓存,以避免频繁调用一些不变的数据。或者,在MyBitas的xml里,select语句where条件有isnull,即这个值有就增加一个where条件,对此,会对任何一个where增加一个不带isnull的查询条件,以免该语句当传入参数都是null时,做全表扫描。或者,干脆说,后端异步返回的数据量很大,时间很长,我在项目里就调大了异步返回的最大时间,或者对返回信息做了压缩处理,以增加网络传输性能。

对于这个问题,我不在乎听到什么回答,我只关心回答符不符逻辑。

一般只要答对,我就会给出“在框架层面有自己的体会,有一定的了解”,否则,我就只会给出“只能在项目经理带领下编写框架代码,对框架本身了解不多”。

其实,在准备面试时,归纳框架里的要点并不难,我就不信所有人在做项目时一点积累也没,只要你说出来,可以说,这方面你就碾压了将近7成的竞争者。

二、别单纯看单机版的框架,适当了解些分布式

此外,在描述项目里框架技术时,最好你再带些分布式的技术。下面我列些大家可以准备的分布式技术。


1、反向代理方面,nginx的基本配置,比如如何通过lua语言设置规则,如何设置session粘滞。如果可以,再看些nginx的底层,比如协议,集群设置,失效转移等。

2、远程调用dubbo方面,可以看下dubbo和zookeeper整合的知识点,再深一步,了解下dubbo底层的传输协议和序列化方式。

3、消息队列方面,可以看下kafka或任意一种组件的使用方式,简单点可以看下配置,工作组的设置,再深入点,可以看下Kafka集群,持久化的方式,以及发送消息是用长连接还是短拦截。

以上仅仅是用3个组件举例,大家还可以看下Redis缓存,日志框架,MyCAT分库分表等。准备的方式有两大类,第一是要会说怎么用,这比较简单,能通过配置文件搭建成一个功能模块即可,第二是可以适当读些底层代码,以此了解下协议,集群和失效转移之类的高级知识点。

如果能在面试中侃侃而谈分布式组件的底层,那么得到的评价就会比较好了,比如“深入了解框架底层”,或“框架经验丰富”,这样就算去面试架构师也行了,更何况是高级开发。

三、数据库方面,别就知道增删改查,得了解性能优化

在实际项目里,大多数程序员用到的可能仅仅是增删改查,当我们用Mybatis时,这个情况更普遍。不过如果你面试时也这样表现,估计你的能力就和其它竞争者差不多了。

这方面,你可以准备如下的技能:

  • SQL高级方面,比如group by, having,左连接,子查询(带in),行转列等高级用法。
  • 建表方面,你可以考虑下,你项目是用三范式还是反范式,理由是什么?
  • 尤其是优化,你可以准备下如何通过执行计划查看SQL语句改进点的方式,或者其它能改善SQL性能的方式(比如建索引等)。
  • 如果你感觉有能力,还可以准备些MySQL集群,MyCAT分库分表的技能。比如通过LVS+Keepalived实现MySQL负载均衡,MyCAT的配置方式。

同样,如果可以,也看些相关的底层代码。

哪怕你在前三点表现一般,那么至少也能超越将近一般的候选人,尤其当你在SQL优化方面表现非常好,那么你在面试高级开发时,数据库层面一定是达标的,如果你连第四点也回答非常好,那么恭喜你,你在数据库方面的能力甚至达到了初级架构的级别。

四、Java核心方面,围绕数据结构和性能优化准备面试题

Java核心这块,网上的面试题很多,不过在此之外,大家还应当着重关注集合(即数据结构)和多线程并发这两块,在此基础上,大家可以准备些设计模式和虚拟机的说辞。

下面列些我一般会问的部分问题:

  • String a = “123”; String b = “123”; a==b的结果是什么? 这包含了内存,String存储方式等诸多知识点。
  • HashMap里的hashcode方法和equal方法什么时候需要重写?如果不重写会有什么后果?对此大家可以进一步了解
    HashMap(甚至ConcurrentHashMap)的底层实现。
  • ArrayList和LinkedList底层实现有什么差别?它们各自适用于哪些场合?对此大家也可以了解下相关底层代码。
  • volatile关键字有什么作用?由此展开,大家可以了解下线程内存和堆内存的差别。
  • CompletableFuture,这个是JDK1.8里的新特性,通过它怎么实现多线程并发控制?
  • JVM里,new出来的对象是在哪个区?再深入一下,问下如何查看和优化JVM虚拟机内存。
  • Java的静态代理和动态代理有什么差别?最好结合底层代码来说。

通过上述的问题点,我其实不仅仅停留在“会用”级别,比如我不会问如何在ArrayList里放元素。大家可以看到,上述问题包含了“多线程并发”,“JVM优化”,“数据结构对象底层代码”等细节,大家也可以举一反三,通过看一些高级知识,多准备些其它类似面试题。

我们知道,目前Java开发是以Web框架为主,那么为什么还要问Java核心知识点呢?我这个是有切身体会的。
之前在我团队里,我见过两个人,一个是就会干活,具体表现是会用Java核心基本的API,而且也没有深入了解的意愿(估计不知道该怎么深入了解),另一位平时专门会看些Java并发,虚拟机等的高级知识。过了半年以后,后者的能力快速升级到高级开发,由于对JAVA核心知识点了解很透彻,所以看一些分布式组件的底层实现没什么大问题。
而前者,一直在重复劳动,能力也只一直停留在“会干活”的层面。

现实的面试中,如果不熟悉Java核心知识点,估计升高级开发都难,更别说是面试架构师级别的岗位了。

五、Linux方面,至少了解如何看日志排查问题

如果候选人能证明自己有“排查问题”和“解决问题”的能力,这绝对是个加分项,但怎么证明?

前大多数的互联网项目,都是部署在Linux上,也就是说,日志都是在Linux,下面归纳些实际的Linux操作。

  • 能通过less命令打开文件,通过Shift+G到达文件底部,再通过?+关键字的方式来根据关键来搜索信息。
  • 能通过grep的方式查关键字,具体用法是, grep 关键字 文件名,如果要两次在结果里查找的话,就用grep 关键字1 文件名 | 关键字2 --color。最后–color是高亮关键字。
  • 能通过vi来编辑文件。
  • 能通过chmod来设置文件的权限。

当然,还有更多更实用的Linux命令,但在实际面试过程中,不少候选人连一条linux命令也不知道。还是这句话,你哪怕知道些很基本的,也比一般人强了。

六、通读一段底层代码,作为加分项

如何证明自己对一个知识点非常了解?莫过于能通过底层代码来说明。我在和不少工作经验在5年之内的程序员沟通时,不少人认为这很难?确实,如果要通过阅读底层代码了解分布式组件,那难度不小,但如果如下部分的底层代码,并不难懂。

1、ArrayList,LinkedList的底层代码里,包含着基于数组和链表的实现方式,如果大家能以此讲清楚扩容,“通过枚举器遍历“等方式,绝对能证明自己。

2、HashMap直接对应着Hash表这个数据结构,在HashMap的底层代码里,包含着hashcode的put,get等的操作,甚至在ConcurrentHashMap里,还包含着Lock的逻辑。我相信,如果大家在面试中,看看而言ConcurrentHashMap,再结合在纸上边说边画,那一定能征服面试官。

3、可以看下静态代理和动态代理的实现方式,再深入一下,可以看下Spring AOP里的实现代码。

4、或许Spirng IOC和MVC的底层实现代码比较难看懂,但大家可以说些关键的类,根据关键流程说下它们的实现方式。

那么在面试时,如何找到个好机会说出你准备好的上述底层代码?在面试时,总会被问到集合,Spring MVC框架等相关知识点,你在回答时,顺便说一句,“我还了解这块的底层实现”,那么面试官一定会追问,那么你就可以说出来了。

不要小看这个对候选人的帮助,一旦你讲了,只要意思到位,那么最少能得到个“肯积极专业“的评价,如果描述很清楚,那么评价就会升级到“熟悉Java核心技能(或Spring MVC),且基本功扎实”。要知道,面试中,很少有人能讲清楚底层代码,所以你抛出了这个话题,哪怕最后没达到预期效果,面试官也不会由此对你降低评价。所以说,准备这块绝对是“有百利而无一害”的挣钱买卖。

七、一切的一切,把上述技能嵌入到你做过的项目里

在面试过程中,我经常会听到一些比较遗憾的回答,比如候选人对SQL优化技能讲得头头是道,但最后得知,这是他平时自学时掌握的,并没用在实际项目里。

当然这总比不说要好,所以我会写下“在平时自学过SQL优化技能”,但如果在项目里实践过,那么我就会写下“有实际数据库SQL优化的技能”。大家可以对比下两者的差别,一个是偏重理论,一个是直接能干活了。其实,很多场景里,我就不信在实际项目里一定没有实践过SQL优化技能。

从这个案例中,我想告诉大家的是,你之前费了千辛万苦(其实方法方向得到,也不用费太大精力)准备的很多技能和说辞,最后应该落实到你的实际项目里。

比如你有过在Linux日志里查询关键字排查问题的经验,在描述时你可以带一句,在之前的项目里我就这样干的。又如,你通过看底层代码,了解了TreeSet和HashSet的差别以及它们的适用范围,那么你就可以回想下你之前做的项目,是否有个场景仅仅适用于TreeSet?

如果有,那么你就可以适当描述下项目的需求,然后说,通过读底层代码,我了解了两者的差别,而且在这个实际需求里,我就用了TreeSet,而且我还专门做了对比性试验,发现用TreeSet比HashSet要高xx个百分点。

请记得,“实践经验”一定比“理论经验”值钱,而且大多数你知道的理论上的经验,一定在你的项目里用过。所以,如果你仅仅让面试官感觉你只有“理论经验”,那就太亏了。

结尾

博主在这里给大家发个福利~
这里整理了20多家公司的真实面试经历,以及各种关于Spring、Spring boot、Spring MVC、MyBatis、MySQL、JVM等知识点,如果有需要的小伙伴可以加群1149778920 来自行领取 暗号:qf
以下是部分资料截图(所有资料均已整合成文档,pdf压缩打包处理)。

(真实经验)我干了5年的JAVA面试官,发现很多求职者都忽略这七大方面的问题!相关推荐

  1. spring ioc原理_干了5年的Java面试官,把他喜欢问的几十个Spring面试题告诉我了

    前言: Spring 框架知识是互联网公司面试必考知识点.对于开发同学来说,Spring 框架熟悉又陌生. 熟悉:开发过程中无时无刻不在使用 Spring 的知识点:陌生:对于基本理论知识疏于整理与记 ...

  2. 干了八年的阿里面试官,给大家分享我面试时最爱问的Java面试题

    因为工作岗位的变动,开始负责给集团招聘一些技术人员,出于对公司的负责,也为了更好的胜任技术经理的职位,在面试的这件事上,我做了大量的"功课",首先我研究了几乎所有大厂的面试题,还和 ...

  3. Java面试官经验谈:如何甄别候选人真实的能力,候选人如何展示值钱技能

    我做Java方面的面试官也有些年头了,从校招学生到初级开发到架构师我都面试过.从技术上来讲,候选人通过面试的标准可能千差万别,但归结成一句话,就是候选人达到了职位介绍的要求,且相关项目经验达到足量的年 ...

  4. 嘘,这份0项目经验应对面试的独门秘籍,千万别被你的面试官发现~

    首先,在写这篇文章前,得先跟各位面试官道个歉. 没错,这篇文章就是要教你们的候选人如何在没有任何项目经验的情况下"瞒天过海",塑造一个实战大牛的形象. 毕竟项目经验实在太香了,手持 ...

  5. 十年Java面试官告诉你如何介绍自己的项目经验

    虽时至年底,大多数小伙伴都知道,2018年是互联网行业最不平凡的一年.各类平台的倒闭.破产.清算,尤其是6.7月分全国大范围P2P集中爆雷跑路,再加上贸易战等,居多因素,裁员的.失业的大有人在,所以, ...

  6. nginx是干嘛用的_上帝视角——面试官常问的nginx的几个问题

    无聊科普下关于nginx会问哪些问题.其实没啥好问的.Nginx基本就会问下面这些问题 问题1:Nginx是用来干嘛的? Nginx是一个高性能的HTTP和反向代理服务器,这个基本是用来前端服务器集群 ...

  7. 一位资深Java的阿里系公司实战面试经验,套路还是面试官的多

    马老师说过,员工的离职原因很多,只有两点最真实: 1.钱,没给到位 2.心,受委屈了 以下是占小狼的一些实战面试经验分享,希望能帮助你们顺利拿到理想Offer! 项目经验 面试官在一开始会让你进行自我 ...

  8. 【面试经验分享】Java 面试中的那些潜规则

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 作者:Java_JJ 来源:https:// ...

  9. 阿里“10”年软件测试经验,面试官通常...........

    (一)面试前的准备工作 (1)在家中记背软件测试基础知识性题目以及测试用例的写法. (2)调查面试公司的网址.公司介绍.公司的地址这些是否是属实. (3)保持好良好的心态,衣着稍微正式一点不要穿平时在 ...

  10. Java面试笔试经验技巧总结

    想找到一份程序员的工作,一点技术都没有显然是不行的,但是,只有技术 也是不够的. 面试笔试经验技巧篇主要针对程序员面试笔试中遇到的 13 个常见 问题进行深度解析,并且结合实际情景,给出了一个较为合理 ...

最新文章

  1. Windows10安装Linux子系统Ubuntu 20.04LTS,轻松使用生信软件,效率秒杀虚拟机
  2. SQL Server:日志备份和差异备份还原中的常见问题示例
  3. Spring中ApplicationContext的事件机制
  4. 【星球知识卡片】注意力机制发展如何了,如何学习它在各类任务中的应用?...
  5. Spring学习使用标签来标记资源(@Component、@Repository、 @Service和@Controller)和用法(包括如何jsp正在使用)...
  6. 显示桌面,原来这么简单的
  7. 人工智能自拍之后,会怎样给自己P图?
  8. mysql 如何按时间备份_如何定时备份mysql数据库
  9. java 内存 静态_java中内存分配以及static的用法(转)
  10. 运行控制器方法之前先执行注解@ModelAttribute的方法
  11. 【BZOJ-1146】网络管理Network DFS序 + 带修主席树
  12. spss和matlab主成分符号,主成分分析及MATLAB和SPSS求解整理
  13. Nmap扫描工具介绍
  14. 关于每次请求都要执行两个,即经过重写FilterInvocationSecurityMetadataSource的getAttributes()方法
  15. Unity Hub 下载2017-2019版本链接
  16. 深度学习-TextDetection
  17. 网站建设:网站安全检测工具
  18. 通过三点用Java求三角形周长和面积
  19. Hazelcast IMDG参考中文版手册-第七章-分布式数据结构
  20. Android学习笔记(二)

热门文章

  1. 武汉大学计算机学院宿舍楼名称,武汉大学寝室排名 寝室图片
  2. Linux下的sock_stream和sock_dgram
  3. SAP-WEB-GUI无法上传excel问题
  4. jupyter notebook 拒绝连接 以及 查 IP
  5. 批处理中的删除命令:del
  6. img图片路径错误时,显示破图/图片裂开,如何处理?
  7. windows默认打开计算机,[Answers 分享]如何在Windows 7中还原.dll文件的默认打开方式...
  8. Mysql安装后环境变量配置
  9. 5月6阴阳师服务器维护,《阴阳师》手游5月6日维护更新公告
  10. JDBC(Java数据库连接)