vlambda博客
学习文章列表

Java面试变成八股文? 我终于知道了真相...

国内的互联网面试,恐怕是现存的、最接近科举考试的制度。


国内的八股文确实是独树一帜。以美国为例,北美工程师面试比较重视算法(Coding),近几年也会加入Design轮(系统设计和面向对象设计OOD)和BQ轮(Behavioral question,行为面试问题)。


所以大多数北美工程师的面试准备是这样的:


刷题:

我见过刷300题左右进Google的,也见过刷1000+题还拿不到offer的.但总的来说,只要面试中遇到的算法题,能够按自己的思路做出来,并能应对面试官的follow up,这一关基本就妥了。所以大多数人会在跳槽前刷LintCode这类的在线编程测评题库。


设计轮:

一般来说是分为系统设计和面向对象设计。5年以下经验的多数会考面向对象设计,和国内不同的是需要画类图;5年以上的大多考系统架构设计。参考资料:系统架构设计2021版;面向对象设计OOD,以上都可以免费试听。


扫码报名,免费试听

Java面试变成八股文? 我终于知道了真相...


BQ轮:

即行为面试问题,常考的问题诸如“你为什么从上一家公司离职”、“你在之前的工作中做过的最有成就感的事情是什么?”等。

可以看出,北美工程师是很少“背答案”的,要么考逻辑思维能力,要么考编程能力,而不是问概念、问理论。


那么为什么国内面试不采取这样的考察方式呢?简单来说,互联网IT行业的求职者太多了,如果考察的是清一溜的算法题和设计题,那么会要求面试官有极高的技术水平,还要花大量的时间成本和精力。


所以,也许现行的八股文面试不是最优的解法,但也是最符合当前国内IT环境的做法。


话又说回来,现在的Java面试真就老八股文了。我光是整理题目就理了半天,答案背也背不完,在我快要放弃的时候,死马当活马医的听了阿里P8杨逍的讲座《大厂Java高级工程师的求职秘诀》,大佬把Java面试题和所有知识点都讲得很通透,感兴趣的话,大家也可以去免费试听一下。


扫码报名,免费试听

Java面试变成八股文? 我终于知道了真相...


先上这些Java面试真题(Java基础)


  • JDK 和 JRE 有什么区别?
  • == 和 equals 的区别是什么?
  • 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
  • final 在 java 中有什么作用?
  • java 中的 Math.round(-1.5) 等于多少?
  • String 属于基础的数据类型吗?
  • java 中操作字符串都有哪些类?它们之间有什么区别?
  • String str="i"与 String str=new String("i")一样吗?
  • 如何将字符串反转?
  • String 类的常用方法都有那些?
  • 抽象类必须要有抽象方法吗?
  • 普通类和抽象类有哪些区别?
  • 抽象类能使用 final 修饰吗?
  • 接口和抽象类有什么区别?
  • java 中 IO 流分为几种?


大厂面试套路:题目深挖+源码解析


回到刚才的问题,Java的面试是需要背的,也确实是老八股文了,但这个背是有技巧的。


举个例子:

“JDK 和 JRE 有什么区别?”


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


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


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


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


详细参数请看下表👇


Java面试变成八股文? 我终于知道了真相...


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


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


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


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


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


Java面试变成八股文? 我终于知道了真相...


Java面试真题整理


接下来就是把面试真题全部摸一遍,阿里P8杨逍老师在《大厂Java高级工程师的求职秘诀》的讲座中会深入剖析30+道大厂经典面试真题,如果自己学起来比较费劲的话,不如听一节视频先入个门,后面也会轻松很多。


我也理了一些课上老师讲过的经典题目出来:


①Java基础:String 类的常用方法都有那些?


    • indexOf():返回指定字符的索引。

    • charAt():返回指定索引处的字符。

    • replace():字符串替换。

    • trim():去除字符串两端空白。

    • split():分割字符串,返回一个分割后的字符串数组。

    • getBytes():返回字符串的 byte 类型数组。

    • length():返回字符串长度。

    • toLowerCase():将字符串转成小写字母。

    • toUpperCase():将字符串转成大写字符。

    • substring():截取字符串。

    • equals():字符串比较。


②容器:如何决定使用 HashMap 还是 TreeMap?


对于在 Map 中插入、删除和定位元素这类操作,HashMap 是最好的选择。然而,假如你需要对一个有序的 key 集合进行遍历,TreeMap 是更好的选择。基于你的 collection 的大小,也许向 HashMap 中添加元素会更快,将 map 换为 TreeMap 进行有序 key 的遍历。


③多线程:sleep() 和 wait() 有什么区别?


• sleep():方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争 cpu 的执行时间。


因为 sleep() 是static 静态的方法,他不能改变对象的机锁,当一个21块中调用了 sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象。


• wait():wait()是 Object 类的方法,当一个线程执行到 wait 方法时, 它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过 notify,notifyAll 方法来唤醒等待的线程。


④异常:throw 和 throws 的区别?


throws 是用来声明一个方法可能抛出的所有异常信息,throws 是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。而 throw则是指抛出的一个具体的异常类型。


以上只是Java面试的冰山一角,感兴趣的话也可以移步杨逍老师的Java面试技巧讲座,这门课程非常看重实用性,设计理念就是“通过真题搞定BATJ大厂面试”,通过40天有计划的训练,带你进阶到阿里 P6+级别。


↓↓扫码免费试听