来自:Java 工程师 -Distance 链接:my.oschina.net/u/3739863/blog/1813292
自己最近几年始终在做 java 后端方面的技术面试官,而在最近两周,又密集面试了一些 java 高级和高级开发的候选人,在面试过程中,我自认为比拟谨慎,遇到问题答复不好的候选人,我总会再三从不同方面发问,只有当重复确认能力不行才会下结论,相同,如果候选人给我的印象不错,我也会从多个角度来掂量,免得招进会说但不会干活的“大忽悠”。
其实倒也不是我成心要尴尬候选人,毕竟入职后就是共事,但面试官的职责使然,而且,如果资深的面试官个别也这样。
写到这里,恐怕会吓到一些想要面试的敌人,能力强和能力弱都会被多问,那怎么办?
这就是本文将要讲到的主题:如何筹备 Java 高级和高级的技术面试。
一. 换位思考下,如果你面试官,你会怎么做
- 只能通过简历和面试来掂量,别无他法。如果某位大牛确认能力很行,但面试时无奈充沛地自证能力,那对不起了,过不了,事实就这样。
- 如果面试官因为能力不行,招进来一个大忽悠,那预计会被领导骂。而且再也不会被让面试了,给领导的印象就不好了。所以不能评主观印象,而是会有些主观规范,具体而言,就是从多个方面问些题目,答好答坏就看候选人的。
其实一些题目都差不多,但不同能力的面试官问问题的切入点和渐进水平会不同,而且有教训的面试官会开掘候选人的劣势,并能从候选人的说辞中判断候选人是真懂还是忽悠。
二. 总体上说下筹备面试的几个方面点
记得之前考政治,某个大题 10 分,分 5 个点,每个点的标准答案不多,也就一两句话。比拟取巧的做法是,涵盖点要全,每个点无需多说,但要说到点子上。相同,如果在某个点做得再多,其它点没笼罩到,只能拿这个点的分。
同理,在面试时,该当综合筹备 java Core,数据库,框架,分布式等方面的题目。依据我面试的后果,我发现不少候选人走了弯路,他们或者罗唆不筹备,筹备时可能办法不到位,单筹备一个方面。比方只筹备了算法题,在这方面答复很好,但其它方面就无所不知了。
所以说,没有所谓的肯定能胜利的面试秘籍,但有能够帮忙晋升成功率的筹备办法。
切记,面试前肯定得筹备,否则胜利的可能性很低,筹备时,得综合看各方面的点。至于每个点要到什么水平,后文会讲到。
三. 架构方面须要筹备的点
高级开发而言,须要让面试官感觉出如下的要点。
- 相熟 SSM 架构,至多在我的项目里做过。
这个的说法是,介绍我的项目时,用一个业务流程来说 spring mvc 如何做的。 - 晓得 Spring MVC 中的细节,比方 @Autowired 的用法,如何把 url 映射到 Controller 上,ModelAndView 对象返回的形式等。
- 最好联合我的项目的用法,说下你是怎么用 AOP,拦截器的,比如说能够通过拦挡 器拦挡非法申请,怎么用 AOP 输入日志等。
- 对于 ORM 方面,不限用过哪种,但得晓得一对一,一多多,多对多等的用法,以及 cascade 和 inverse 的用法。
- 最好晓得申明式事务的做法。
如果你要应聘高级开发,那在上述根底上,最好理解如下的知识点: - Spring Bean 的周期
- 最好能通过浏览源代码,说下 IOC,AOP 以及 Spring MVC 的工作流程
- 最好能联合反射,说下 IOC 等的实现原理
- Spring Boot 和 Spring Cloud 的一些知识点
四. 数据库方面须要筹备的点
不少候选人会看很多 SQL 的技巧,比方 select 该怎么写,insert 又该怎么写,但仅限于此,不会再筹备其它的。
这样就很吃亏,因为面试官会认为,哪怕是高级开发,SQL 语句也该会写,所以这块不会多问,而会问如下方面的问题。
- 索引怎么建的,怎么用的?比方我建好了一个索引,在 where 语句里写 name like ‘123%’ 会不会走索引,怎么状况下不该建索引,哪些语句不会走索引。
- 除了索引之外,你有过哪些 SQL 优化方面的教训,比方分库分表,或通过执行打算查看 SQL 的优化点。这最好是能联合你做的我的项目理论来讲。
这里,我面试下来,大略有 70% 的候选人只晓得根本 SQL 的写法,所以哪怕你是只有实践教训,会说一些优化点,也是十分无利的。
这块对于高级开发而言,更得理解优化方面的技能。
五. Java Core 方面须要筹备的点
这块是根底,其实很多问的问题,候选人肯定会在我的项目里用到,但很少能说好说全。
这块次要会从汇合,多线程,异样解决流程以及 JVM 虚拟机这些方面来问。
汇合方面:
- hashcode 有没有重写过?在什么场景下须要重写。如果能够,联合 hash 表的算法,说下 hashmap 的实现原理。
对于高级开发而言,最好通过 ConcurrentHashMap 来阐明下并发方面的底层实现代码。
- ArrayList,LinkedList 的差异,比方一个基于数组,一个基于链表,它们均是线程不平安的,ArrayList 的扩容做法等。
对于高级而言,最难看下底层的代码。
- Set 如何实现防重的,比方 TreeSet 和 HashSet 等。
- Collection 的一些办法,比方比拟办法,包装成线程平安的办法等。
- 可能有些面试官会问,如何通过 ArrayList 实现队列或堆栈,这个能够筹备下。
多线程方面
其实在我的项目里不怎么会用到,但会问如下的问题:
- synchronized 和可重入锁的差异,而后可能会顺便问下信号量等防并发的机制。
- 在线程里该如何返回值,其实就是 callable runnable 区别。
- 肯定得通过 ThreadLocal 或 volatile 关键字,来阐明线程的内存模型。
- 线程池方面,会用,理解些罕用参数
线程方面,可能问得比拟多的就是并发机制,如果是高级开发,可能会问得深些。
虚拟机方面
- 结构图和流程能够大抵说下。
- 肯定得理解针对堆的垃圾回收机制,具体而言,能够画个图,说下年老代年轻代等。
- 说下垃圾回收的流程,而后针对性地说下如何在代码中优化内存性能。
- 最好说下如果呈现了 OOM 异样,该怎么排查?如何看 Dump 文件。
- GC 的一些概念,比方强弱软援用,finalize 办法等,这些能够筹备下。
六. 算法,设计模式等,其实是虚的
这块好筹备,不过话说哪怕这些没答复好,但能证实有相干技能的我的项目教训,个别也会让过。
不过在这块,不少候选人就轻重倒置了,比方就筹备算法,设计模式,方才提到的框架,数据库和 Java Core 方面就不筹备了。这样很吃亏,就好比考政治只温习了一个点,其它一点也不筹备。
七. 我面试的感触 & 听到哪类答复就能证实候选人比拟资深
- 大多数的候选人(大略 7 成)间接就来了,不做任何筹备。要晓得,面试和我的项目其实有些脱节,哪怕我的项目做得再好,不做筹备照样通不过,只有我确认过这类人的确无奈达标,我拒掉他们没任何心理累赘,谁让他们不筹备?
- 还有些候选人态度很好,显著筹备过,但没筹备到位,比方像方才所说,只筹备了算法,或者在 Java Core 方面,只看了汇合方面的面试题。
对于这些同学,哪怕是过了,我也会感到可惜,毕竟如果面试好些的话,工资也能更高些,至于哪些过不了的,我敢说,如果他们筹备过,预计就不是这个后果了。
其实我也晓得,人无完人,哪怕我本人去面试,也不可能八面玲珑,所以,我不会要求候选人什么问题都能答复出,甚至大多答错也没关系,只有能证实本人的能力即可通过面试。
我也和不少面试官交换过,依据咱们的教训,如果候选人能说出如下的知识点,即能证实他在这个畛域比拟资深了,在这块,我可能就不会过多地问问题了。
架构方面
- 能证实本人能够干活(这不难),同时能联合底层代码说出 IOC,AOP 或 Spring MVC 的流程,只有能说出一个即可。或者能说出拦截器,Controller 等的高级用法。
- 能证实本人有 Spring Boot 或 Spring Cloud 的教训,比方能说出些 Spring Cloud 组件的用法。
- 如果能证实本人有分布式开发的教训,那最好了,其实这不难证实,比方能说出服务的包是放在多台机器上(大多数公司其实都这样),而且能说出如何部署,如何通过 nginx 等做到负载平衡。
数据库方面
其实讲清楚一个问题即可:如何进行 SQL 调优,比方通过索引,看执行打算即可,如果有其它的优化点,说分明即可。
Java Core 方面
这里给出些窍门:
- 能联合 ConcurrentHashMap 的源代码,说出 final,volatile,transient 的用法,以及在其中如何用 Lock 对象避免写并发。
- 联合一个我的项目理论,说下设计模式的实际。
- 多线程方面,能说出 Lock 或 volatile 等高级知识点的用法。
- 这块最取巧:说下 GC 的流程,以及如何通过日志和 Dump 文件排查 OOM 异样,如果再高级些的话,说下如何在代码中优化内存代码。
逆锋起笔
是一个专一于程序员圈子的技术平台,你能够播种最新技术动静
、最新内测资格
、BAT 等大厂大佬的教训
、增长本身
、学习材料
、职业路线
等等,微信搜寻逆锋起笔
关注!