Java后端面试,大小厂必问的难题有哪些?
摘要:你好,我是yes。 这个系列的文章不会是背诵版,不是那种贴上标准答案,到时候照着答就行的面试题汇总。 我会用大白话尽量用解释性、理解性的语言来回答,但是肯定没有比平时通过一篇文章来讲解清晰,不过我尽量。 暂时我先放 20 题出来,字数实在太
你好,我是yes。
这个系列的文章不会是背诵版,不是那种贴上标准答案,到时候照着答就行的面试题汇总。
我会用大白话尽量用解释性、理解性的语言来回答,但是肯定没有比平时通过一篇文章来讲解清晰,不过我尽量。
暂时我先放 20 题出来,字数实在太多了,放一些之后看反馈,然后再修订,之后再搞个 pdf。
还有,虽说看着只有 20 题,其实不止,因为有些题目我没拆解,回答中会有延伸问题,所以题目数不止我列出的这些,内容还是非常多的。
剩下还有几十题,先亮一亮题目,嘿嘿。
文章首发我的个人公众号:「yes的练级攻略」,之后还有会网络篇、操作系统篇、Spring 篇、Netty 篇等等之类的,感觉满满当当的,好充实.....
到时候公众号后台也会开放 pdf 提供下载的哈。
好了不多哔哔,gogogo!
1.你觉得 Java 好在哪儿?
这种笼统的问题如果对某些知识点没有深入、系统地认识绝对会蒙!
所以为什么经常碰到面试官问你一些空、大的问题?其实就是考察你是否有形成体系的理解。
回到问题本身。我觉得可以从跨平台、垃圾回收、生态三个方面来阐述。
首先 Java 是跨平台的,不同平台执行的机器码是不一样的,而 Java 因为加了一层中间层 JVM ,所以可以做到一次编写多平台运行,即 「Write once,Run anywhere」。
编译执行过程是先把 Java 源代码编译成字节码,字节码再由 JVM 解释或 JIT 编译执行,而因为 JIT 编译时需要预热的,所以还提供了 AOT(Ahead-of-Time Compilation),可以直接把字节码转成机器码,来让程序重启之后能迅速拉满战斗力。
(解释执行比编译执行效率差,你想想每次给你英语让你翻译阅读,还是直接给你看中文,哪个快?)
Java 还提供垃圾自动回收功能,虽说手动管理内存意味着自由、精细化地掌控,但是很容易出错。
在内存较充裕的当下,将内存的管理交给 GC 来做,减轻了程序员编程的负担,提升了开发效率,更加划算!
然后现在 Java 生态圈太全了,丰富的第三方类库、网上全面的资料、企业级框架、各种中间件等等,总之你要的都有。
基本上这样答差不多了,之后等着面试官延伸。
当然这种开放性问题没有固定答案,我的回答仅供参考。
2.如果让你设计一个 HashMap 如何设计?
这个问题我觉得可以从 HashMap 的一些关键点入手,例如 hash函数、如何处理冲突、如何扩容。
可以先说下你对 HashMap 的理解。
比如:HashMap 无非就是一个存储 <key,value> 格式的集合,用于通过 key 就能快速查找到 value。
基本原理就是将 key 经过 hash 函数进行散列得到散列值,然后通过散列值对数组取模找到对应的 index 。
所以 hash 函数很关键,不仅运算要快,还需要分布均匀,减少 hash 碰撞。
而因为输入值是无限的,而数组的大小是有限的所以肯定会有碰撞,因此可以采用拉链法来处理冲突。
为了避免恶意的 hash 攻击,当拉链超过一定长度之后可以转为红黑树结构。
当然超过一定的结点还是需要扩容的,不然碰撞就太严重了。
而普通的扩容会导致某次 put 延时较大,特别是 HashMap 存储的数据比较多的时候,所以可以考虑和 redis 那样搞两个 table 延迟移动,一次可以只移动一部分。
不过这样内存比较吃紧,所以也是看场景来 trade off 了。
不过最好使用之前预估准数据大小,避免频繁的扩容。
基本上这样答下来差不多了,HashMap 几个关键要素都包含了,接下来就看面试官怎么问了。
可能会延伸到线程安全之类的问题,反正就照着 currentHashMap 的设计答。
3.并发类库提供的线程池实现有哪些?
虽说阿里巴巴Java 开发手册禁止使用这些实现来创建线程池,但是这问题我被问过好几次,也是热点。
问着问着就会延伸到线程池是怎么设计的。
我先来说下线程池的内部逻辑,这样才能理解这几个实现。
首先线程池有几个关键的配置:核心线程数、最大线程数、空闲存活时间、工作队列、拒绝策略。
默认情况下线程不会预创建,所以是来任务之后才会创建线程(设置prestartAllCoreThreads可以预创建核心线程)。
当核心线程满了之后不会新建线程,而是把任务堆积到工作队列中。
如果工作队列放不下了,然后才会新增线程,直至达到最大线程数。
如果工作队列满了,然后也已经达到最大线程数了,这时候来任务会执行拒绝策略。
