Java 面试总结
面试了一些公司,也拿到了几个 offer,但是特别心仪的也还没有。
结合面试的一些共性还有自己的一些想法,总结一下 Java 类面试的一些心得,希望大家一起来讨论。
通常开始套路都是自我介绍和项目介绍,然后会针对项目中用到的业务和技术展开讨论,然后再问一些共性的问题。当然也碰到过完全忽视项目上手问些网络上烂大街的题目,如果是遇到这种技术面试官,不聊也罢了,估计公司的技术也是不怎么样了。
现在来总结一下面试的几个方面吧。
-
JVM 相关
问的比较多的就是 GC 的一些原理,GC 的策略,或者一些参数的意义,JVM 参数调优这些,一般来说泛泛场景的调优没有任何意义,我一般会反问一下场景,然后大部分面试官就算了 😵。
也有问的比较多的常用的一些定位问题的命令,这个大家还是有必要了解一下的,特别是 jstatck 这些,实际项目中使用也很广泛的,还有一些内存监控的命令。
还有就是 Java 类加载器,双亲委派的机制什么的。 -
并发、线程安全相关
这个问题就比较多了。
- 问的比较多的就是锁,锁的粒度,又或者,synchronized,volatile 这些关键字的差异。跟 ReentrantLock 有什么不同?最好不要背答案,真正懂的面试官肯定要追问,还是要好好理解其中的区别的。
- 常见的 concurrente 包下面的一些类,以及原理,比如是不是一定用了 ConcurrentHashMap 就是线程安全的?
- 大部分时候,都是会先让你说说怎样的类是线程安全的,然后针对一些点深入下去,所以还是要理解原理,个人的理解是尽量把类内部的数据暴露出来给外围去控制,因为不知道调用端是以什么方式和什么方式调用,是否会修改数据,一定要暴露,则要委托给线程安全的数据结构。
- 线程池的几种类型及差别,项目中一般怎么用。
- 还有一些线程同步的问题,或者也会有个场景,比如让你写个场景,你会打算怎么写,性能最高。
-
算法
大概是因为我没有去面过头条吧,遇到的算法题还真不多,就是特别喜欢问红黑树和 B+ 树,也不知道是为啥。
算法部分,请其他小伙伴来补充吧。 -
Spring 全家桶相关
这部分问题就比较多了。
- Spring 的初始化的过程,主要涉及工厂的初始化,资源查找,依赖查找,Bean 初始化等,这些其实比较好准备,各种书里或者面经里都有。
- SpringAOP 的原理。
- SpringMVC 一个请求处理的过程,大多数都会对拦截器比较感兴趣。
- Spring 的事务拦截是怎么实现的(核心也是 AOP 了),实现原理是什么
- 自己写过哪些拦截器(除了权限,日志那种烂大街的),实现了什么业务。
- 如果有一种自己实现的模板服务,要怎么集成到 Spring 里面。
以上这些如果走读过一些 Spring 源代码的话,大多都问题不大了。
- redis 相关
- redis 的存储结构大概是怎样的,为什么要这么设计
- 项目中是怎么用 redis 的?主从还是集群等等。失效策略,为什么这么设计等等
- 知道缓存穿透么,怎么避免。
- 数据库相关
点也很多了,这里大概列一下:
- Innodb 和 Myisam 的区别,我都不知道为啥总有这题目,感觉很没意义。
- 索引的应用,一般怎么加索引,怎么用索引,哪些字段不适合加索引。
- 分库分表用过么,什么策略,用到了哪些开源的组件。
- 锁,有没有遇到过死锁。
- 事务,事务的隔离级别,然后会用同样的语句,根据不同的隔离级别答出会有的结果。
- 千万级的数据量查询优化会怎么做?
- 高并发下,如何安全的修改同一行数据?
- 性能优化相关
这个涉及到的层面就比较多了,从 web 端到中间件到数据库,涉及到大量的知识点
- 缓存
- 异步机制
- 消息中间件的选用(会顺便问到中间件的一些机制)
- 数据库层面的优化(上面数据库里面提到的)
- 分库分表策略
- 网络通讯相关
- TCP 原理
- HTTPS 原理
- HTTP 的一些知识,有时候会问到 HTTP2.0
- 同步,异步,阻塞,非阻塞的概念等等。
总体来说,一般面试管还是会根据项目用到的技术点来展开,所以简历是你最好的准备的材料,要确保写到的内容都充分理解了,如果只是大概用到了,不妨在项目描述之外提一下就可以了。否则很容易被问出问题来。
好了,这个只是针对我面试中一些常见的问题的总结。可能很初级了,大佬就不要笑话,先打扎实 JVM,并发编程,Spring 源码和数据库的基础知识之后,如果面试机会多的话,多去面面,攒攒面经,然后查漏补缺是最好的方式了(不过现在面试机会也是很稀缺的资源了)。
最后祝大家早日拿到自己心仪的 offer,我也要努力! 💪
这个总结很不错,很全面喽 ~
Android 的过来围观 ~
后端的技术关注点真的是不一样啊。
看不懂,但是点个赞。
已入选「优选」,感谢提供极具价值的内容!
完全看不懂,就膜拜一下。
完全看不懂,就膜拜一下。
很全面了,差不多就是这样,我现在就是对照着这几个点在查漏补缺。谢谢楼主。
程序员的职业壁垒真的高
好厉害
突然发现,消息中间件可以单独列一下,蛮多会问到源码级别的问题。
楼主多少工作几年了啊
5 年不到一点,4 年多。
楼主如果有空,帮忙出一份给面试者的 Java 面试题可好,多谢多谢
有道理哦。
好主意好主意。
向大佬学习
哪里是什么大佬哦,小罗罗而已。