面试的话题总是很热门,特别是关于大厂的面试,而事实只有极少的程序员能够进入大厂,更多的是普通的中小企业,当然还有一类争议很多的外包公司,这些普通的中小企业的面试和大厂的风格其实差别还是很大的,这类面试对于大多数程序员来说,可能更有价值。希望这位同学的面试经历对你能有帮助。
面试背景:
2022-06。电话面试,本科,2年工作经验,薪资12K左右,一轮面试,最终通过
面试时长50分钟,推测应该是外包公司的初面
面试官人狠话不多,简单问了一下面试什么岗位,就直接开始了,先让说了一下常用技术栈,然后就开始问问题了。
======Java基础======
问题1:重写和重载
非常基础的问题,一般只出现在初级的面试里。如果你想装B一下的话,可以把话题引到Object的Equals方法上,比如你可以说重写是面向对象里很重要的概念,也是多态的体现形式之一,最常见的重写就是对Equals方法的重写,比如常用的String类,就对Equals方法进行了重写。。。。
对于一般的初级程序员,至此这个回答已经非常nice了,而社牛程序员可以继续往下装,你可以再说一说你工作中有没有做过重写,比如POJO类equals的重写,hasCode方法的重写。以及为什么要重写hasCode方法。而说到重写equals和hasCode方法又牵扯到了List、map、set这一超级面试题了。
问题2:父类的静态方法是否能重写
问题3:static有什么作用?
static写在类、字段、方法、代码块、静态构造函数上作用各不相同,在类、字段、方法上就不细说了,静态代码块用的不多,可以看下面的链接:https://blog.csdn.net/sinat_33921105/article/details/79509638
很基础的问题,菜一点的面试官可能问到类、字段、方法上可能就差不多了,有点能力的面试官会往深入去挖,问代码块的作用。还有如果在子类继承父类的情况下,代码块、静态构造函数的执行顺序。而这个问题纯靠背不好背,最好的办法就是撸代码。把各种情况的代码敲出来,看看执行结果,再去思考为什么会这么设计,去更深入地理解静态类为什么要这么设计。
问题4:static存储的数据是放在什么地方的?
关于这个问题网上的东西不是很多,我找了一篇比较好的讲解,留在这里,读者可以详细看一看。
https://blog.csdn.net/AOSIDIN/article/details/120017024
对于大多数的初级工程师的面试来说,这个问题答不上来问题不是很大,能说出来是在Jvm哪个区域也算不错的。如果想得到更好的OFFER,那么建议你认真去理解一下文章里面的东西。
问题5:接口与抽象类的区别?
问题6:接口里的方法有没有默认实现?
以上两个问题是面向对象概念里比较基础的题,问题6其实面试官想问的是你对JDK1.8特性的了解,1.8之后接口的方法可以有默认实现,而1.8之前是没有的。
问题7:值传递和引用传递
问题8:Java是值传递还是引用传递?
Java中其实是没有引用传递的概念的,所有的参数传递其实都是值传递,但是传的值如果是
问题9:final是干什么的?你有用过final么?用来做什么业务?
问题10:我有一个方法,在try块里定义个i=0,然后i++,并且return了。在final块里面也执行了i++,请问最后返回的值是多少?
先看下代码:
public class Test { public static void main(String[] args){ int a = dod(); System.out.println("return:"+a); } public static int dod(){ int i=0; try{ i++; System.out.println("try:"+i); return i; } finally { i++; System.out.println("finally:"+i); } } } ===========运行结果======== try:1 finally:2 return:1
从代码可以看出返回值是不受finally里面代码的影响的。
========多线程=======
问题11:线程用过吗?线程的创建方式是什么?
问题12:Callable和runnable有什么区别?
问题13:wait和sleep有什么区别
问题14:synchronized你是怎么理解的?
问题15:他锁的是对象还是方法
问题16:lock锁有用过吗?
问题17:死锁有碰到过吗?
问题18:怎么避免死锁情况的发生?
乐观锁和悲观锁
这一系列的问题从11-15各种面试题库里基本都有答案,一般也没有什么问题,真正的考验是在问题17和18,因为面试官是需要你讲出一个能够造成死锁的场景,以及怎么避免这种情况,如果讲不出来,面试官则可以断定你对多线程的理解是比较基础的。
另外如果11-15这些问题都答不上来的话,也就不会有问题17了,这个求职人答的还可以。
======集合======
问题19:Java集合中常用的接口有什么?
这种问法有点奇怪,面试的同学刚刚开始有点蒙,但同学比较机灵,让面试官举了个例子,面试官说比如说List。这时候同学知道要答什么了。
这种情况面试中非常常见,面试官对一个问题的切入点可能是五花八门的,一时没搞明白很正常,让面试官稍解决一下可能你就明白是什么了。
问题20:HashMap底层数据结构是什么?
问题21:ArrayList的扩容机制是什么样的?
这部分没啥说的,Java面试必会的,HashMap底层数据结构,至少你要能够答到数组加链表加红黑树,以及什么情况下会用到链表、什么情况下会用到红黑树。还有HashMap的扩容机制、增长因子,要求高一些的公司(比如大厂)则会问的更深一些,比如为什么HashMap初始大小是16,为什么增长因子是0.75,为什么扩容一次是2倍,为什么链表超过8会用红黑树。还有的会问如果让你设计一个HashMap,你会怎么去设计,如果多线程的场景下使用HashMap会有什么问题?如何解决等等?
====异常处理=====
问题22:Java中常见的异常
问题23:Throw和Throws的区别
题目比较基础,一般的新手菜鸟能答上来就行了,如果想拿高薪,可以在项目中的异常处理机制这个角度深挖下去。特别是Web项目中,整个项目的异常处理是怎么搞的。后端怎么做的全局异常处理,前端又是如何做的统一异常处理。
=======Spring框架======
问题24:Spring中IOC的实现你有看过吗?
问题25:Spring中Bean的作用域?
问题26:Mvc的工作流程
问题27:Spring和SpringMvc的常用注解
问题28:@Autowired和@Resource的区别
问题29:SpringBoot为什么现在能火起来?
都是Spring部分比较基础的面试题,也是非常常见的面试题。没啥说的。
=====数据库=======
问题30:MySql中的脏读幻读是什么?
问题31:索引用过吗?
问题32:索引失效的情况有哪些?
比较重要,必会
问题33:varchar和char的区别
问题34:varchar(20)里面,这个20的单位是什么?是字符还是字节?
问题35:有往数据库存过emoji表情吗?
求职人答的是在数据库里存图片文件,讲到了数据库里怎么存储二进制文件,这种方式实际工作中几乎不可能用到,能答上来即可,不建议在自己的项目中用这种方式存储。
其实这个问题还有另外一个答题的角度,因为emoji表情实际上也是一段代码,比如数据库里存储的是:我很[伤心],而软件界面上则会显示成:我很
这个功能一般是要和前端显示架构配合起来的。比如常见的富编辑框组件。
问题36:如果是记录金钱的话,用什么字段?
问题37:精度怎么控制?
问到数据类型相关的问题时经常会问到这个,必须了解。
问题38:MySql里面的左右连接是什么?
问题39:当发现Sql比较慢的情况下,你是怎么处理的?
问题40:MySql中explain关键字有用过吗?
问题41:如果加索引的话是任何字段都可以加吗?
问题42:性别可以加索引吗?
问题39-42是典型的数据库优化相关的问题,其中explain很多初学者都不知道,虽然很多答不上来这个问题也能面试通过,但还是建议把explain好好研究一下,对实际工作也是大有益处的。
问题41、42则是需要对索引真正的理解,靠死记硬背是不行的。
======缓存======
问题43:缓存有用过吗?
问题44:缓存常用 的类型有哪些?
问题45:Redis里面的淘汰策略是什么?
问题46:Redis的使用场景
问题47:缓存过什么数据?
问题48:缓存穿透有了解过吗?
问题49:Redis的持久化有做过吗?
关于缓存这个可以很简单,也可以很难。通常有经验的面试官直接会去问你缓存是怎么用的。然后会结合你项目中实际的用法去和你交流你的用法中可能出现的问题。
=====Http协议=====
问题50:Http有接触过吗?
是Http协议还是?对的。Http协议没有了解过
问题51:Http协议的方法都有哪些?
问题52:Put是用来干什么的?
问题53:你常用的是什么?
问题54:修改数据也是用的Post吗?
问题55:Http中常用的状态码有哪些?
HTTP协议,大多数时候不太会问到,因为一般情况下技术面试在30分钟左右都结束了,基本上不大有时间问这么基础的问题,而偏偏这个基础很多初学者都会忽略的问题,如果你背面试题很痛苦这个题你可以放弃,然后面试的时候多找一找对于找工作最后的结果影响不会很大。如果感觉没有那么痛苦的话,建议你花点时间了解一下,毕竟如果你有做WEB开发的能力的话,理解这个并不是很难。
======代码管理======
问题55:代码版本管理用过哪些?
问题56:冲突有了解吗?
问题57:你不担心你的代码被搞掉吗?
代码管理最常见的问题就是代码冲突了怎么办。这里核心的原则就是不要自己擅自做主删除冲突的代码,一定要沟通清楚后再处理。
其它的也会常问一些git的常用命令,整体来说这一部分不是太重要,会了更好,即使答不上来,实际工作中一般也能在很短的时间内搞定。只看面试官对这一部分的重视程度了。
======业务场景=======
问题58:订单和支付类的有做过吗?
问题59:订单是什么类型的,是和淘宝类的那种商品订单吗?
问题60:大体介绍一下订单功能?
问题61:如果让你做一个商品订单的话,你会怎么去设计 ?
问题62:那我一个订单里面的所有的商品信息怎么办?
问题63:你的意思是做一个订单和商品的关联表?
问题64:如果让你设计一个支付和保存订单的流程的话,你会怎么设计?
问题65:商品里涉及库存的问题怎么处理?
问题66:下单之后没有支付 ,这个商品库存减不减?
问题67:如果有10个商品,有20个人进来买,20个人都处于待支付状态,这时有10个人已经支付了,剩下的10个人怎么办?
问题68:这种情况就很尴尬,我下了单有点事,没支付,过了一会儿回来下的单没了,这不是很尴尬么?
问题69:JWT了解吗?
问题70:项目中用过吗?
场景题是技术面试中最能够看出水平的面试问题,这类问题没有什么好的办法,只能是平常的学习过程中多思考,多积累。当然了一些比较经典的场景可以在短期中攻克一下的。比如这次面试里面的订单的场景和支付的场景。
=====其它=====
问题71:Linux相关的东西知道吗?
问题72:最近在学习什么东西吗?
问题73:Cloud了解多少?
问题74:你对未来的职业发展方向或技术发展方向是怎么考虑的?
问题75:你之前的工作流程是怎么样的?
问题76:你们的项目怎么部署的?
72、74一般是HR的问题,自研的公司问的相对比较多,外包公司很少会问。这类问题的回答网上给的建议很多都是比较装B的,比如未来的规划,有很多建议说希望自己未来几年能做到项目经理,几年做到技术主管之类的,这种回答方式很扯淡。怎么可能人人都是领导。
我则建议职业规划类的问题从自己想在未来能够做成什么样的事情这个角度去回答,比如希望未来1年之内能够独立完成项目开发,2年内能够具备完成项目公共代码或组件的开发,3年能够达到架构师的水平。5年内学习一些项目管理的知识,具备项目经理的基本能力。
还可以用一些比较接地气的方式去回答,比如工资想拿到多少。网上很多人说公司都比较反感这种这么俗气的求职者,在我看来其实这个是能够衡量很多事情的最简单的办法,而且从求职者的角度,把这个事情说出来也能够筛选掉一些比较职场PUA的公司,而能够接受薪资想法开放的求职的公司,相信这样的公司不会差到哪。
===========================
整体来看这次面试是一个比较典型的清单的式面试,貌似面试官那里有一套题库似的,而且常见的Java工程师面试题大部分都问到了。有些话题面试官问的比较浅,有些也会稍稍往深处去问一些。