和两年前相比,为什么今年的Java面试这么难?

先说结论:企业对员工的技术水平要求真不高。但Java技术更新的太快了,就很容易造成面试难度与实际开发难度不匹配,外加求职人数逐年增加,怎么办?提升面试难度。

而以让大家觉得今年更难的原因是多方面的,分几点说说我的看法:

1、高校毕业人数激增,初级人才饱和

这几年互联网行业进入平稳发展阶段,但高校毕业人数却逐年激增,光2020年,就有874w应届生毕业。但现在国内IT行业已经不缺初级技术人才了,从培训出来的部分人,也没有足够的上岗能力。

2、前浪带头摸鱼

大部分前浪已经不愿意把心思花在工作上了,这就导致出现了一种“占着茅坑不拉屎”的错觉,阻挡了很多技术精湛的年轻人入场。后浪在门外哭泣,感叹面试难度太高。

3、后疫情时代,坑位有所减少

疫情让很多小公司雪上加霜,或干脆倒闭破产了。岗位跟找工作的人数严重不匹配,让很多中小企的HR都开始“优中选优”,激化内卷矛盾。

所有的这些因素好巧不巧赶一块了,就显得今年的难度格外高。

和两年前相比,为什么今年的Java面试这么难?_第1张图片

下面来分享一些我的破局观点,感兴趣的同学也可以听听我的《Java高级工程师》免费讲座,里面会详细介绍目前java的学习资料和不同职级的能力要求,并带大家掌握后端高频题

3年前我从FB回国落地阿里担任后端技术专家,大大小小也面试了百人。在我的团队里,有刚踏出校门的应届生,也有转岗/跳槽来的优秀伙伴。我从他们的学习方式上找到了很多共同性,想展开分享给大家。

破局第一步:了解不同职级需要哪些必备技能:

P5

Java语言的高级特性:并发、算法、线程、模板使用

关系数据库:索引怎么建,索引算法是什么,怎么调优,百万到亿级数据量之间要做什么工作

面向对象/设计模式:一般通过项目讲解

总结:需要掌握算法/数据结构,高效运用关系数据库、设计模式

P6

抓住简历中的项目,不断深挖技术,主要看你是不是真的理解,考察Spring框架、并发/多线程编程、动态代理、RPC框架等。

总结:主要考察独立架构能力,喜欢刨根问底问源码、底层实现的方法

P7

高可用框架(非常重要),JVM原理和优化,Spring cloud面试官一般会深入了解,云计算说得好非常有含金量。

总结:主要考察技术专家的能力底蕴,和微服务架构的理论和实践等

和两年前相比,为什么今年的Java面试这么难?_第2张图片

不难看出吧,从P5到P7需要掌握的可不仅仅是基础知识和架构能力,底层逻辑、实现原理、微服务架构都!要!明!白!

大家可以根据自己目前的技术水平去跟公司的职级要求一一对应,查漏补缺,也可以来我的《Java高级工程师》免费讲座,或许我能帮助到大家。

破局第二步:摸清大厂面试套路

如果你参加过大厂面试,这些问题应该耳熟能详:

  • 熟悉Spring、mybatis等框架实现原理吗?
  • 是否接触过消息中间件,负载均衡、RPC框架等技术,MySQL分库分表是否接触过?
  • 阐述一下分布式架构设计,Redis分布式锁

是不是跟你私下准备的“面试高频题”有点区别,如果有这种感觉的话,你还需要更努力的去学习。

这里我总结一些我在面试中常问的问题,大家可以根据自己的薄弱项去准备:

Java常见基础题(八股文)

  • JDK 和 JRE 有什么区别?
  • == 和 equals 的区别是什么?
  • 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
  • final 在 java 中有什么作用?

容器

  • Java容器有哪些
  • Collection 和Collections 有什么区别?
  • List、Set、Map 之间的区别是什么?

多线程

  • 并行和并发有什么区别?
  • 守护线程是什么
  • 创建线程有哪几种方式

反射

  • 什么是反射
  • 动态代理是什么?有哪些应用?
  • 怎么实现动态代理?

对象拷贝

  • 为什么要使用克隆?
  • 深拷贝和浅拷贝区别是什么?

Java Web

  • jsp 和servlet 有什么区别?
  • jsp 有哪些内置对象?作用分别是什么?
  • session 和cookie 有什么区别?

我划分的比较细,篇幅有限这里就不一一展示了,感兴趣的来我的《Java高级工程师》讲座免费听

  • 异常
  • 网络
  • 设计模式
  • Spring / Spring MVC
  • Spring Boot / Spring Cloud
  • Hibernate
  • Mybatis
  • RabbitMQ
  • Kafka
  • Zookeeper
  • MySql
  • Redis
  • JVM
  • ...

破局第三步:深挖高频题+源码解析

其实Java面试可以通过“死记硬背”完成

和两年前相比,为什么今年的Java面试这么难?_第3张图片

举个例子:

“JDK 和 JRE 有什么区别?”

这么简单的问题相信大家都会,等你答上来了面试官就会继续追问:

“除了javac你还了解些什么命令行工具,它们的用途是什么?”

很多人只答得出jcmd、jps、jinfo、jstat、jmap以及jstack等工具,但对应的用途却记不清了。答出来的也不要太得意,后面还有灵魂拷问。

“你用过jstat吗?你了解哪些参数?”

详细参数请看下表

和两年前相比,为什么今年的Java面试这么难?_第4张图片

到这已经难倒95%的人了,但面试官可能还会追问:

既然StringBuffer具备线程安全性,迭代开销又小,那我们实践中首选它就ok了吗?

这正是大厂面试Java程序员的基本套路——从简单题入手,再慢慢的挖掘背后的原理,从而判断求职者的技术水平,目的是考察对源码的深挖意识。

所以,想搞定Java面试,一定要拥有精益求精的精神,深挖底层原理,把技术栈学通透。

举个例子,在“Java 中操作字符串都有哪些类?它们之间有什么区别?”这道题上,如果能答出“StringBuffer和StringBuilder都继承自抽象类AbstractStringBuilder”,面试官就知道你是读过源码的人,能给你加不少分。

和两年前相比,为什么今年的Java面试这么难?_第5张图片

和两年前相比,为什么今年的Java面试这么难?_第6张图片

Java面试真题解析

从开篇展示的真题中,我挑了几道最近经常出现的,带大家一起分析下。

1、Java基础:final 在 java 中有什么作用?

  • final 修饰的类叫最终类,该类不能被继承。
  • final 修饰的方法不能被重写。
  • final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

2、容器:List、Set、Map 之间的区别是什么?

和两年前相比,为什么今年的Java面试这么难?_第7张图片

3、多线程:并行和并发有什么区别?

  • 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
  • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
  • 在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。

所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

4、反射:动态代理是什么?有哪些应用?

动态代理:

当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。

动态代理的应用:

  • Spring的AOP
  • 加事务
  • 加权限
  • 加日志

5、对象拷贝:深拷贝和浅拷贝区别是什么?

  • 浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())
  • 深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)

6、Java Web:jsp 和servlet 有什么区别?

  1. jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
  2. jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。
  3. Servlet中 没 有 内 置 对 象 ,Jsp中 的 内 置 对 象 都 是 必 须 通 过HttpServletRequest对 象 , HttpServletResponse对 象 以 及38HttpServlet对象得到。
  4. Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

7、异常:try-catch-finally 中,如果catch 中return 了,finally 还会执行吗?

答:会执行,在return 前执行。

示例代码

和两年前相比,为什么今年的Java面试这么难?_第8张图片

8、网络:tcp 为什么要三次握手,两次不行吗?为什么?

为了实现可靠数据传输,TCP 协议的通信双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方收到的。三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。

如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认。

你可能感兴趣的:(java,程序人生)