Java 面试总结

面试了一些公司,也拿到了几个 offer,但是特别心仪的也还没有。

结合面试的一些共性还有自己的一些想法,总结一下 Java 类面试的一些心得,希望大家一起来讨论。

通常开始套路都是自我介绍和项目介绍,然后会针对项目中用到的业务和技术展开讨论,然后再问一些共性的问题。当然也碰到过完全忽视项目上手问些网络上烂大街的题目,如果是遇到这种技术面试官,不聊也罢了,估计公司的技术也是不怎么样了。

现在来总结一下面试的几个方面吧。

  • JVM 相关
    问的比较多的就是 GC 的一些原理,GC 的策略,或者一些参数的意义,JVM 参数调优这些,一般来说泛泛场景的调优没有任何意义,我一般会反问一下场景,然后大部分面试官就算了 😵。
    也有问的比较多的常用的一些定位问题的命令,这个大家还是有必要了解一下的,特别是 jstatck 这些,实际项目中使用也很广泛的,还有一些内存监控的命令。
    还有就是 Java 类加载器,双亲委派的机制什么的。

  • 并发、线程安全相关
    这个问题就比较多了。

  1. 问的比较多的就是锁,锁的粒度,又或者,synchronized,volatile 这些关键字的差异。跟 ReentrantLock 有什么不同?最好不要背答案,真正懂的面试官肯定要追问,还是要好好理解其中的区别的。
  2. 常见的 concurrente 包下面的一些类,以及原理,比如是不是一定用了 ConcurrentHashMap 就是线程安全的?
  3. 大部分时候,都是会先让你说说怎样的类是线程安全的,然后针对一些点深入下去,所以还是要理解原理,个人的理解是尽量把类内部的数据暴露出来给外围去控制,因为不知道调用端是以什么方式和什么方式调用,是否会修改数据,一定要暴露,则要委托给线程安全的数据结构。
  4. 线程池的几种类型及差别,项目中一般怎么用。
  5. 还有一些线程同步的问题,或者也会有个场景,比如让你写个场景,你会打算怎么写,性能最高。
  • 算法
    大概是因为我没有去面过头条吧,遇到的算法题还真不多,就是特别喜欢问红黑树和 B+ 树,也不知道是为啥。
    算法部分,请其他小伙伴来补充吧。

  • Spring 全家桶相关

这部分问题就比较多了。

  1. Spring 的初始化的过程,主要涉及工厂的初始化,资源查找,依赖查找,Bean 初始化等,这些其实比较好准备,各种书里或者面经里都有。
  2. SpringAOP 的原理。
  3. SpringMVC 一个请求处理的过程,大多数都会对拦截器比较感兴趣。
  4. Spring 的事务拦截是怎么实现的(核心也是 AOP 了),实现原理是什么
  5. 自己写过哪些拦截器(除了权限,日志那种烂大街的),实现了什么业务。
  6. 如果有一种自己实现的模板服务,要怎么集成到 Spring 里面。

以上这些如果走读过一些 Spring 源代码的话,大多都问题不大了。

  • redis 相关
  1. redis 的存储结构大概是怎样的,为什么要这么设计
  2. 项目中是怎么用 redis 的?主从还是集群等等。失效策略,为什么这么设计等等
  3. 知道缓存穿透么,怎么避免。
  • 数据库相关
    点也很多了,这里大概列一下:
  1. Innodb 和 Myisam 的区别,我都不知道为啥总有这题目,感觉很没意义。
  2. 索引的应用,一般怎么加索引,怎么用索引,哪些字段不适合加索引。
  3. 分库分表用过么,什么策略,用到了哪些开源的组件。
  4. 锁,有没有遇到过死锁。
  5. 事务,事务的隔离级别,然后会用同样的语句,根据不同的隔离级别答出会有的结果。
  6. 千万级的数据量查询优化会怎么做?
  7. 高并发下,如何安全的修改同一行数据?
  • 性能优化相关
    这个涉及到的层面就比较多了,从 web 端到中间件到数据库,涉及到大量的知识点
  1. 缓存
  2. 异步机制
  3. 消息中间件的选用(会顺便问到中间件的一些机制)
  4. 数据库层面的优化(上面数据库里面提到的)
  5. 分库分表策略
  • 网络通讯相关
  1. TCP 原理
  2. HTTPS 原理
  3. HTTP 的一些知识,有时候会问到 HTTP2.0
  4. 同步,异步,阻塞,非阻塞的概念等等。

总体来说,一般面试管还是会根据项目用到的技术点来展开,所以简历是你最好的准备的材料,要确保写到的内容都充分理解了,如果只是大概用到了,不妨在项目描述之外提一下就可以了。否则很容易被问出问题来。

好了,这个只是针对我面试中一些常见的问题的总结。可能很初级了,大佬就不要笑话,先打扎实 JVM,并发编程,Spring 源码和数据库的基础知识之后,如果面试机会多的话,多去面面,攒攒面经,然后查漏补缺是最好的方式了(不过现在面试机会也是很稀缺的资源了)。

最后祝大家早日拿到自己心仪的 offer,我也要努力! 💪