面试总结 -Java-2 年
0. 背景介绍
主语言 Java,框架 Spring Boot,对微服务有简单的了解和应用。2 年工作经验。
2019 年 8 月,开始着手看新工作机会,可能这个时间段并不是一个很好的时间,机会并不是很多,但是还是收到了一些大厂小厂的面试邀请。面试了大概 3 个周左右,包括小米、京东、滴滴、新浪、摩拜、猫眼等一些公司,还包括其他一些上市的、没上市的、不需要融资的公司,以及一些国企、央企等。总之有大厂,有小厂,可以说是很全面了。最后进了猫眼娱乐。通过这次面试也充分认识到了自己的一些不足。下面对这些做一个总结。
1. 公司划分
我对面试的这些公司做了一个简单的划分,大概分了 3 个梯队。
第一梯队
一线大厂。比如 BAT、华为、小米、京东、滴滴。
大厂的面试看中的主要是算法、JVM、源码等,感觉看中的更加是你的内功,对你做过的项目**相对而言**不是特别重视。所以面试这些公司的时候一定要准备些算法的知识。**手写算法!!**
第二梯队
上市公司或者融资情况比较好的 C 轮、D 轮的公司。比如猫眼、新浪等。
这些公司面试主要看中的一个是对常用框架的的理解,比如 Spring 全家桶,另一个比较看中的是高并发、多线程的问题。所以如果面试这些公司的时候,数据库的事务,索引、锁、以及 Java 的多线程、锁、concurrent 包一定要有所准备。
第三梯队
国企、央企、以及非互联网行业的大规模的公司。比如一些中 xx 院 xx 所、一些教育行业的公司等。国企公司十有八九是猎头给你推的(PS:如果你在猎聘网上有简历的话)。
由于是国企的性质,所以笔试题一定要刷,特别是一些 Java 基础中细节的问题,比如 String 的不可变属性,Integer 的缓存、final 与 finally 的区别、finally 中的 return 执行顺序等等等等,各种语法上的细节一定要有所准备。另一个方面是 SQL 语句,笔试题里一定少不了写 SQL。最好网上找几套面试题做做。**相对而言**,面试就不是特别重要了。
第四梯队
天使轮、A 轮、B 轮等部分创业公司。
这部分公司内容就比较杂了,面试的范围主要看面试官的水平。差一点的可能会让你先做笔试题(参考第三梯队),好点的会问一些 JDK 源码、问一些 MySQL 的事务隔离级别。再好一点的,可能会问一些 Servlet、Spring、Spring Boot 源码的东西。甚至会让你手写 SQL。这部分公司,怎么说呢,随缘吧,感觉你怎么准备都应付不全。只能说兵来将挡,水来土掩。
面试题目细节
面试题目细节分几个方面,由于每次面试结束后也没有做总结(PS:缺点!!),现在只能靠回忆,所以部分内容可能不是特别全面。
1. JDK 相关
**关键字:String、Integer、HashMap、HashTable、ConCurrentHashMap**
比如:
```
String a = "hello";
String b = "world";
String c = a + b;
String d = "helloworld";
String a1 = new String("hello")
String b1 = new String("world")
String c1 = a1 + b1;
String d1 = new String("helloworld")
```
哪个跟哪个相等?为什么?在内存中的存储方式有是什么样的?基本上是一套组合拳。
再比如,
HashMap、HashTable 的区别是什么?你可能会说一个线程安全,一个线程不安全,
然后会问你 HashMap 为什么不安全? HashTable 与 ConCurrentHashMap 有什么区别?又是一套组合拳。
这里推荐一篇美团技术团队的博客 [Java 8 系列之重新认识 HashMap](https://tech.meituan.com/2018/11/15/java-lock.html)
2. JVM 相关
**关键字:Java 运行时内存划分、Java 内存模型(JMM)、垃圾回收(GC、CMS)、Java 类加载过程**
推荐一本书吧,经典的 《深入理解 Java 虚拟机 第二版》 周志明的。不用从头看完,拔苗助长下,重点看这几章,先把面试过了再说。
PS:给自己的博客打个广告
+ [JVM 读书笔记(一) 内存划分](https://zdran.com/20190322.html)
3. Thread 相关
**关键字: 线程池、ThreadLocal、volatile、sleep、wait、各种锁(自旋锁、偏向锁、轻量锁)**
推荐一篇美团技术团队的博客 [不可不说的 Java“锁”事](https://tech.meituan.com/2018/11/15/java-lock.html),详细说明了 Java 中的各种锁,质量没的说!
线程池和 ThreadLocal 是最常被问到的,多看看博客,即便是生产环境没用过,到时候被问到也要有话可说。
4. 算法 相关
**关键字: 链表(双指针法)、树(二叉查找树、B 树、B+树、红黑树)、字符串相关(匹配子串,split 实现)**
比如:
1. 链表翻转
2. 获取单链表的第 N 个元素
3. 获取单链表的倒数第 N 个元素
4. 在一个二叉查找树中查询某个元素的前一个元素
5. 求一棵二叉树的高度。
6. 判断一个数组是否符合二叉查找树的中序遍历结果
7. 给你一个 List 构造一个树形结构
8. 字符串的 split 方法的实现
9. 字符串子串匹配算法
10. 以及各种常见的排序、查找算法
**手写!!! 大厂必考题!!**
5. MySQL 相关
**关键字: 索引存储结构、聚簇索引、事务隔离级别、以及使用索引的场景,创建索引时需要考虑的条件**。
推荐一篇美团技术团队的博客 [Innodb 中的事务隔离级别和锁的关系](https://tech.meituan.com/2014/08/20/innodb-lock.html) ,深入浅出的讲解了事物的隔离级别,个人感觉质量非常高。
6. Spring 相关
**关键字: IoC、AOP、SpringBoot 启动过程、Spring 处理 HTTP 请求的过程、Spring Boot 与 Spring MVC 的区别**。
面试的时候可能会先让你说一下 IoC、AOP 然后,有关 IoC 的可能会问 Autowired、 Resource 注解的区别、依赖注入的方式,依赖冲突的解决办法等。AOP 可能会问实现方式,以及实现原理,基本上会问到 **动态代理** 的内容
Spring 相关的,可能会问到 Spring Boot 的启动过程、处理 Http 请求的过程(甚至包括 DNS 解析的部分)比如,会问,我从浏览器发起一个 http 请求到接收到响应,中间发生了什么?
再深入一点会问到,Spring 是怎么把 Http 的数据流绑定到具体的 Java bean 上的?
7. SQL 相关
面试的套路基本上都是给你一个或者两个表结构,然后让写个查询语句。
基本的 CURD 就不说了,重点关注 group by、order by 以及关联查询、组合查询、分页。面试的时候一定会遇到 SQL 题的。
PS:给自己的博客打个广告
+ [SQL 性能优化的几条建议](https://zdran.com/20190417.html)
+ [MySQL 学习笔记](https://zdran.com/20180529.html)
开放题
开放题大部分都集中在大数据量的问题上,比如:
1. 我有一个文件,文件里面有几百万甚至上千万的有序记录(总之,内存一次是加载不全的),你要如何快速的查询到某个具体的记录?
2. 当你的订单量超过百万级别甚至是千万级别,你如何存到数据库里? 这时候你可能会说,分库分表,然后下一个问题就是如何分,分完之后如何查。
3. 我开了 10 个线程来处理数据库里的订单信息,如何保证同一个订单只能被处理一次?如果在处理途中又有新的订单进来,怎么保证新的订单也会被处理?
这些题的答案基本上都不是唯一的,每个人都有每个人的理解,因为技术栈的不一样,所以想到的解决方案也不一样。感觉主要还是看面试者解决问题的思路。
这部分其实我也没有什么特别好的办法准备,不过也不要担心,当问到这个问题时,你可能没有最好的思路,但是你至少可以保证有一个能解决问题的思路,先不要关心数据量的问题,先说出来一个解决方案,然后再一点点思考怎么优化,面试官也可能会引导你去优化。
个人感觉,这类题的解答套路无非是时间不够,空间来凑,线程来凑。
时间不够,那就考虑下把某些数据存起来,节省查询时间。或者开多个线程来处理。往这个方向上思考,思路一般不会错。
框架图
项目整体框架图,或者叫架构图,一般大点的公司都会要求你说一下,或者画一下,画的时候会要求你简单说一下,某个功能的调用关系,某个模块做了什么,你负责了哪个模块,哪个功能,怎么做的?
所以面试前最好准备下项目架构图,自己先画一下,调整下模块的布局,尽量画的清楚(是清楚,不是美观!)些,一般架构图大致分三层,上层是入口,中层是业务逻辑层,下层是数据层,两侧可能还会有管理模块,定时模块,监控模块,数据分析模块等。一边画一边介绍每个模块的作用,功能。最后再说一下某个具体的功能是怎么调用的
所以这部分面试的准备就是再次熟悉下自己做过的项目,不要去研究代码细节,从大局入手,整体架构,模块,技术栈,依赖关系,调用关系。然后再仔细的熟悉下自己做的功能,最好自己跟自己讲几遍。
为什么离职?
这是每个公司面试都少不了的问题,所以面试之前一定要根据具体的公司,岗位的工作内容来回答。
比如:小公司到大公司。
现在的公司业务量少,所以想到大公司接触一些流量比较大的项目
比如:A 行业到 B 行业
我对现在的工作内容不是特别感兴趣,一直在做 xxx,所以想换一个我喜欢的行业。我对 B 行业比较感兴趣,刚好看到 xx 公司的招聘信息,就投了简历来试试。
PS:**一定要简单了解下 B 行业,因为,下一个问题有可能是,谈谈你对 B 行业的了解 :)**
比如:大公司到小公司
我在现在的公司一直在负责 xxx 的 A 模块,但是对 xxx 的整体架构,业务逻辑都没有机会了解,所以想换个工作机会能够接触到 xxx 的完整的业务逻辑。
总之一句话,见机行事!哪怕你仅仅是因为薪资不满意离职的,也要尽量想一个靠谱点的离职原因。
为什么选择我们公司的这个职位?
这个问题一般是 HR 来问的,如果能面试到这里,说明已经成功了一大半了。
回答这个问题,一般从 3 个方面吧,行业、公司、技术匹配程度
我对这个行业比较感兴趣,而且贵公司在这个行业比较领先的。
如果这个公司是小公司,那就从技术匹配程度上说。我看了贵公司的招聘信息,觉得自己的技术方向与招聘的技术要求比较匹配,而且对贵公司(或者这个行业)比较感兴趣,所以就投了一下简历。
PS:**面试前一定要了解下要面试的公司,行业。知己知彼嘛**
最后
大厂面试败在了手写算法上,对 Spring 全家桶的源码也不够了解。很是遗憾。争取在这两年内把这方面的技术提升上来。
最后,祝大家都能找到满意的工作!!
版权声明: 本文为 InfoQ 作者【U+2647】的原创文章。
原文链接:【http://xie.infoq.cn/article/faf4b89c5f5e3cea4525086f0】。文章转载请联系作者。
评论