如何准备Java面试?如何把面试官的提问引导到自己准备好的范围内?

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

3 别光背题,要结合项目讲,最好结合你解决过的线上问题讲

网上有不少分布式(以及其它方面)的面试题,比如netty或dubbo底层细节问题,这些有用,但如果你背熟了,面试里最多得到的评价是“了解分布式组件理论”,聊胜于无,如果对于要有分布式组件经验的工作,你就悬了。对于分布式组件,大家实现该如何准备呢?(其实后文提到的亮点也一样)

1 一定要应用在项目里,因为面试官只关心对应的商业项目经验,比如你的dubbo是用在订单系统调会员系统方法里,你的mycat,netty等是用在什么场景,这点简历上未必能体现出,但面试时一定要说,这样能证明你用过。

2 分析问题的能力优于开发能力,所以你最好再结合一个场景说明,比如在项目介绍时,你外带一句,dubbo方面我解决过因超时而导致的问题,然后等面试官来问,问的时候,你大致说下,然后面试官看你对linux看日志的命令,以及dubbo关于超时时间的配置以及问题上下文说得没毛病,那么应该也就信了。

3 这时可以再结合一些面试题准备下细节,比如看netty堆外内存,线程模型,redis数据结构。有些面试官听你说出解决问题的说辞,可能就不问了,有些可能会再问些底层问题,那么你这时候再说下。

这里大家可以对比下两种表现方式,一种是什么也不准备,或者只准备背网上的题目局,等面试官问,那么面试官一定不客气,想到哪问哪,比如netty会问很细,你平时的项目经验未必涵盖到,如果你再无法结合应用讲清楚,那面试官可能认为你只有理论经验。另一种是项目介绍时抛出,而且找机会通过解决过的实际问题抛出,外带稍微了解下细节,这样不仅能很容易让面试官感觉你有实际项目经验,更能展示“看日志解决实际问题”的能力。两者差别一看就知道,更何况其实只要方法得到,准备其实也不难。

4 准备数据库调优和虚拟机调优及排查oom问题的说辞

按值钱的技能排序,对于一般的初级和高级开发而言,除了分布式组件,下面就是调优方面的能力了,具体可以是分布式调优,这之前讲过, 还有数据库调优和虚拟机调优。同样除了在简历上明写之外,还该做哪些准备呢?

数据库跳调优方面。

1 熟悉索引,包括索引结构,复合索引和回表,这块应该大家都会说,同样要结合项目案例说。

2 单机版,通过看执行计划,调优SQL语句,这块怎么准备?项目中,会在linux上设置,如果有超过10秒的SQL就打印出来,然后通过执行计划看耗时点,比如大多是走全表扫描,或者有了索引没用到,或者子sql运行了多次,再往深讲就是Oracle里连接方式不对。你通过执行计划看到问题所在后,就对应修改,比如建复合索引,或者通过with语句把子查询提取出来。

总之这里你得体现出通过日志看长sql,以及通过执行计划看耗时点。至于如何修改,大多数候选人都能说,但你更知道前两点, 就比别人强了。

3 如果你感觉还有能力,可以再讲些MyCAT分库分表和redis方面的调优能力,毕竟这块涉及到分布式组件。这方面可以准备的项目说辞是:比如业务请求里,会经常用公司ID向风控模块看风险情况,那么就可以用ID做键,风控字段做值,另外再把null放到键里,以放缓存击穿。另外对于一个千万级别的大表,你可以用ID作为分表字段,分10个表,根据最后一位的值定位到具体的表。同时排查所有的SQL语句,把一些可能全表关联的SQL语句,比如带group by和多表关联,或者用Java业务写,或者优化。同时再网上看些面试题准备些相关MyCAT和Redis的语法说辞。这样你会额外增加“分布式性能调优”方面的经验。

在虚拟机方面,我另外有篇博文:在面试中如何展示虚拟机和内存调优技能,大家可以照着准备,总之也是先结合项目展开,然后围绕虚拟机结构展开调优技能,再可以照这篇文章内部类、final与垃圾回收,面试时你一说,面试官就知道,进一步展示你的能力,同时再能照如下的范例,说出你解决过的OOM问题。

第一步,发现系统很卡,或者日志里频繁出现OOM异常。第二步,用dump文件看OOM时的内存镜像,看的工具可以是JMAT。这两个步骤是通用的。

第三,通过dump文件,再结合日志上下文,发现了OOM的原因,比较简单的原因是Redis缓存超时时间过长,或者是ThreadLocal里的对象用好没remove(这块还涉及到弱引用,大家可以自己去查,本文不展开),或者创建线程池时,等待队列设置成了无界,或者你在mybatis里,where条件都是带if的,即如果传入id和name再拼装where id = xxx之类的语句,在一种场景里,都没传条件,所以where后面不带条件,把数据库里记录全捞出来了,导致OOM。

如果你再经历过,甚至可以说到Netty堆外内存管理不善而导致的问题,如果能说到这个程度,甚至面试架构师都行。

第四是解决,发现问题后,对症下药解决就很容易,比如降低Redis超时时间,或者修改好对应的代码。但既然你说是根据线上问题排查出来的,那么就得说如何解决,善始善终。总之这里是结合线上问题发现的,所以就别说些因Connection对象没关闭,大的HashMap用好没clear之类的问题了,倒不是这些原因不会引发OOM问题,而是这些问题大多会在上线前测试阶段解决掉了,你再把它们说成线上问题,可能会暴露你们项目组能力不行。

5 java核心方面,准备集合,线程和异常处理等方面的亮点

通过上述分布式组件和调优方面的说辞,你展示的能力已经比别人强很多了,虽然相比之下,java核心方面的能力属于单机版的技能,但毕竟属于基础技能,你除了基本问题之外,也得适当准备亮点。如下给出些同样适用于初级开发的亮点。

1 集合方面,可以准备下HashMap和hashcode的底层代码,同样可以准备下ArrayList和快速失效(fast fail)的底层代码,然后再进一步看下ConcurrentHashMap的读写并发管理部分的代码,因为其中包含volatile,散列表数据结构和线程并发部分的技能,而且jdk1.7和1.8 ConcurrentHashMap的底层代码实现起来还不同,你如果找到机会通过这个对象展示多线程并发和数据结构的能力,或许Java核心方面,面试官就不问别的问题了。

2 线程方面,准备下锁,volatile,线程池和ThreadLocal的说辞,具体通过ConcurrentHashMap了解下锁(1.7)版本和synchronized+volatile(1.8版本)的用法,以及ThreadLocal里可能引发内存泄漏的问题,这些点网上都有,本文就不展开了,其实也未必多,能讲清楚就行了。

3 异常方面,准备下你在项目里的异常处理方法实践说辞,比如尽量缩小try…catch的范围,finally从句里放释放资源的代码,catch里应尽量处理异常,先用IOException等专业异常处理,再用Exception兜底,以及尽量缩小异常的影响范围,别让程序一遇异常就崩。

Java核心方面,其实还有很多可以挖掘的点,比如String, final关键字等,而且Java核心方面,网上面试题太多了,这里就不再展开了。同样这里要结合项目案例,比如在测试阶段发现了因为遍历集合而导致的问题,同时展开快速失效,或者在压测阶段发现因HashMap在高并发场景下丢数据所以用ConcurrentHashMap,同时展示其中的volatile和并发等细节。

其实上述技能不复杂,初级开发照样能说,但涉及到了底层代码,尤其ThreadLocal还涉及到弱引用和OOM问题,更能体现实力,哪怕你经验未必比人家多,但你面试时能结合底层代码展示,想都不用想,面试官一定看好你。

6 介绍项目时,抛出准备过的亮点,别展开

上文里给出的是面试准备的技巧,按值钱角度分析,讲了分布式组件、数据库和JVM调优以及Java核心方面的技能,更重要的是,你是结合实际项目准备的。

台上一分钟台下一年功,如果准备得当,面试时你就可以发挥了。先是在自我介绍环节,你除了介绍基本情况学校学历外,还可以综合说明,比如用过Redis组件,有过数据库和JVM调优经验,有过压测经验(下文会讲),有过排查OOM方面问题的经验等,总之别客气,准备了就说。

然后进入到项目介绍环节,除了介绍项目背景,开发情况以外,你再结合业务说,这里给出若干说辞范例。

1 这个项目里,我们用到了Dubbo作为模块间的调用,我除了写代码外,还解决过因dubbo超时也引发的问题(别展开)

2 在数据库方面,我除了实现技能外,还做了数据库调优,具体用过索引,执行计划,redis缓存和MyCAT分库分表,最后两点自己斟酌。

3 在项目里,每个请求我们会用一个线程处理,其中用到了ThreadLocal对象(结合业务引出ThreadLocal),对此我还解决过因ThreadLocal和线程池设置不当而引发的OOM问题。同时这里可以抛出准备过的其它OOM问题说辞。

4 在这个项目里,我参与过压测,并在压测过程中解决过 OOM问题,并通过看日志优化代码,从而改善了系统的响应时间。

5 在这个项目里,我会结合Cat系统监控长SQL问题,一旦出现,我会通过看Linux日志排查问题。(展示看日志排查问题的能力,同时可以进一步展示你准备过的技能)。

大家可以看到,上述结合项目抛出的亮点时没有展开,因为这时属于项目介绍阶段,如果展开的话可能会让面试官感觉你条理不清晰,而且抛出的亮点都是属于分布式和调优等高级技能。对一些Java核心方面的单机版技能,别人或许当成宝,你可能都掌握的值钱技能太多,都不算什么了。当然,后面有机会,你还是要展示Java核心部分的亮点,只是优先讲更值钱的。

7 回答技术问题后,可以引导到你准备过的亮点上

你介绍项目时,由于已经抛出了足够多的亮点,所以后面面试官自然而然就会往这方面提问,这样就达到了引导效果。比如听你讲到Redis缓存,自然就会问了, 问题无非是怎么用?这你可以结合你的项目实际说,底层细节,这块网上资料太多。也就是说,通过项目介绍,你可以把面试官引导你准备好的话题上,这还不算,在回答问题的时候,你照样还能引导,如下给出些引导的技巧。

1 比如你在回答redis相关问题时,如果之前你没机会讲“排查因超时时间过长而引发的OOM问题”,那么还可以展开说,对redis,我还解决过xx问题,面试官自然会问了,然后再展开。

2 当你回答好redis问题后,可以再“顺口”说句,在我们项目里,除了redis外,还用过dubbo组件,结果过因dubbo超时时间过长而导致的问题。然后面试官自然就会问到这块了,你同样可以准备些dubbo底层细节的问题,这方面也很多资料。

3 在回答好任何数据库相关的问题,比如索引,JDBC等,你顺口说句,我在项目里,还通过执行计划(或Mycat)优化过SQL技能,然后然开。

4 在回答好任何集合(如ArrayList)方面问题时,你可以说,在遍历集合的时候,我们项目里会非常小心快速失效问题,然后展开。

5 在回答好任何线程内存模型,或被问到volatile相关问题时,你就说,我知道ConcurrentHashMap里用到volatile,我能具体说下吗?再结合这个对象,扩展到 线程并发话题,而且这还是结合底层代码讲的。

6 被问到任何异常处理问题,比如运行期异常,如何自定义异常,那么再引导到异常处理最佳实践。

7 从ThreadLocal,引出底层的Weak引用话题,再引出JVM结构以及OOM调优方面的话题。

写到这里我都懒得再写了,在上文里,我已经列出了很多亮点,它们两两横向关联,你说好一个再关联另外一个,足以能全方面展示技能。但在扩展时你需要注意,万一面试官没接嘴问,你就要立即停止,或者另外找机会再引导,这时如果再说下去,就属于自说自话了。而且尽量不露痕迹地引导,比如上文给出的范例中,引导的话术大多是,除了xx技术,我们项目里还用到了xx(关联性很强)技术,然后坐等面试官来问。

也就是说,遇到一些不大自主思考的面试官,你甚至可以通过事先准备外带面试引导,控制面试全程节奏,哪怕是遇到一些大厂的面试官,你同样可以据此把问题引导你熟悉的范围,最多就再根据网上面试题再准备些(dubbo,线程模型等的)细节问题,毕竟人的思维方式的很相似的,听到你“随口”这样一说,很有可能就“接茬”向下提问了。

8 更可以引导到压测和排查线上问题经验等的值钱话题

总结

在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了

面试真题

Spring源码笔记

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-FB9FHOky-1713320660244)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值