Java开发必考题!

作者:hzldds2020

链接:https://www.zhihu.com/question/414988138/answer/1421614993

来源:知乎

老是听到xxx要求越来越高的声音,其实回顾多年的职业生涯,作为经常当面试官的我,出来说句公道话,其实大厂技术招聘层面的要求一只就在那里,对核心技能的要求并没有太大的改变。

可能你要反驳分布式、高并发、多线程,spring boot 、 spring clould 、Hadoop、Spark等等技术层出不穷,作为新晋的开发者必须跟上云云。请你先冷静下,这些技术名词,更多要求的是术的层面而非道的层面。接下来我们就面试时对java研发工程师的要求来掰扯掰扯,看看到底是要求变高了,还是一直一来达不到要求的人太多。

1.数据结构与算法。简单的算法与数据结构你还是该掌握的吧?这个要求过分吗?作为程序员的你,如果连数组,链表,这两个基本的结构都搞不懂,还拿什么指望你去理解,平衡二叉树,红黑树,哈希表,堆,桶,图,这些更为复杂的数据结构?简单的冒泡和选择排序手写下都面有难色的主,还指望他听过快排、插入、希尔、堆排序、二路归并、多路归并、桶排、计数、基数这些本该掌握的很基础的东西?有些时候遇到点知道时间复杂度和空间复杂度的人都阿弥陀佛了……

2.操作系统。基本的linux命令你还时要会几个撒?内存分配、进程、线程调度这些简单基础的概念你还是应该有一点撒?别说这些东西没用,很多时候在实现的时候,很多软件参考了不少操作系统的设计思想。

3.数据库层面。几大范式定义概念搞懂。数据库事务的ACID总能扯明白吧?隔离层级分别保障的粒度,和依然存在的问题你得知晓吧?有些都工作几年的人了,不过分吧?SQL优化搞没搞过?主流的MYSQL的存储引擎之间的区别,几种索引的区别和应用场景,应该如数家珍撒?作为一只技术狗,数据库事务的实现方式你应该知道一些吧?二阶段提交、三阶段提交你知道不?这些知道几分,就看你个人深浅了。

以上算通用层面的东西,只要你说你是个程序员,你就应该知道。下面我们就来掰扯下和java有关的东西了。

1.集合方面:map,set,list的区别概念,你总该晓得吧?你看数据结构重要不?我问你点具体的实现类简单点的就HashMap HashSet ArrayList,看你能扯多少,要是能行的话我们换点稍微有意思的话题HashTable,CurrentHashMap,TreeSet,LinkedHashSet,LinkedArrayList,BlockingQueue及其各种实现看你能掰扯几分了?这些要求真心不过分哈,搞java的嘛,这些怕是老生常谈的面试规矩噢?

2.IO方面:BIO\NIO\AIO你有能知道多少呢?这个话题可就多了也见深浅了,话题也开放了。基本的IO操作,到实现机制、设计模式乃至操作系统的各种调度我都可以和你聊一聊,也顺便可以和你扯一扯mina,netty,Grizzly,听没听过,玩没玩耍过,相信很快能摸出你的深浅。别说这些没有用哈,rpc的框架的异常堆栈抛出来了,基本上都在上面三个东西里面。

3.多线程:你以为这个你能跑得掉?线程的生命周期,同步异步的区别,什么时候需要同步,什么时候需要异步,线程的调度方式,聊聊并发编程,为啥要并发,怎么去并发,你处理了哪些并发问题,说句真心话,别说没有应用场景,都知道业务流程有主次之分,那么对于不影响主流程的次要流程,你如果都没异步处理过的下,你过去搞的系统嘛,真滴有点儿呵呵了。

4.虚拟机的那些事儿:都搞java了,虚拟机的一些东西你总得知道吧?JVM的内存模型,垃圾回收机制,各种机制下的垃圾回收器怎么工作还是知晓些吧。JVM字节码那个太苛刻了,一般不会要求你,如果你非要看了有些面经上来炫技,那么必须满足你的诉求,大家好生掰扯,希望你能达到目的。

5.一些基本的东西你还是要有吧:http协议、https协议,dns解析过程、servlet是个什么东西?生命周期如何?request/response区别,session/cookie区别实现机制,redirect/forward的区别你能给简单讲讲?这些都是基础知识哈,如果搞web开发这个都不晓得,你搞的是啥?

6.编程框架:搞web开发的,问下web的框架执行流程总得讲一下吧,比如SpringMVC是如何工作的?你自己实现个web框架可以还是不可以?怎么做,可有思路?自己吃饭用的勺子怎么工作的你还是应该了解的撒?别说现在要求高,过去还会把问题换下,struts webwork springMVC的执行流程你都给讲一下?有什么区别?为什么没有提strus2?因为已经问过了。

7.既然都已经扯到了Spring了,那么IOC\AOP的实现原理怎么来的,bean的作用域有哪些,务传播机制,隔离层级,基本还是要问问的?反射,代理怎么回事不可能搞不清楚吧。代理的几种方式JDK的cglib的aspectJ的,你又知道多少?抛弃了框架你自己实现基于类的代理有门么?mybatis听过没?不管你听没听过反正jdbc那些事情,数据库连接池的那些事情,我们有得聊,只要你能勾起我们的聊天兴趣。还没聊spring boot呢,上面这些你掌握得比较好,都够可以了。

8.通用性质的一些东西:大名鼎鼎的apache你知道吗?web服务器,应用服务器类的区别你知道吗?ngnix玩耍过没?ngnix你都用来干了些什么?缓存可有听过?怎么来玩耍?从浏览器端一直到后端的各层缓存该怎么来玩耍?策略又是如何来定的?分布式缓存可有听过?memcached,redis可有玩耍过总之话题很多,不一而足。

9.分布式的一些概念:你可知晓为啥要分布式?分布式有哪些经典问题?简单点的如何实现应用无状态,全局唯一ID(莫要拿什么雪花算法之类的烂大街的来扯,被当成机构里听了两句就出来扯的是,那真的阿弥陀佛恭喜你了),负载均衡有没有概念?如何做?如何去做高可用?如何去保障分布式环境下的一致性问题?消息中间件玩耍过没有?知不知道都有哪些,实现区别在哪里,用它干嘛去?分布式的环境下如何去保障服务的可靠性?如何面临雪崩问题?如何面临穿透问题?包括但不限于spring cloud的相关话题,都解决了哪些分布式中哪些个方面性的问题,如何解决的,策略有哪些?问题多的是,看你有多少深浅了。

总而言之,问的都是道的层面多一点,原理性质的多一点,原理它就在那里,术的层面变化得很快,但总而言之都是为了去解决道的某个问题。你了解术的层面,最多只说明你对技术感兴趣,这很好,但是道的要求它始终在那里,核心的东西十年前和现在没啥差别,一直摆在那里。