--- title: 手把手教你如何准备Java面试(重要) category: 知识星球 icon: path --- ::: tip 友情提示 本文节选自 **[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)**。这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计、常见框架、分布式、高并发 ......)、优质面经等内容。 ::: 你的身边一定有很多编程比你厉害但是找的工作并没有你好的朋友!**技术面试不同于编程,编程厉害不代表技术面试就一定能过。** 现在你去面个试,不认真准备一下,那简直就是往枪口上撞。我们大部分都只是普通人,没有发过顶级周刊或者获得过顶级大赛奖项。在这样一个技术面试氛围下,我们需要花费很多精力来准备面试,来提高自己的技术能力。“[面试造火箭,工作拧螺丝钉](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247491596&idx=1&sn=36fbf80922f71c200990de11514955f7&chksm=cea1afc7f9d626d1c70d5e54505495ac499ce6eb5e05ba4f4bb079a8563a84e27f17ceff38af&token=353590436&lang=zh_CN&scene=21#wechat_redirect)” 就是目前的一个常态,预计未来很长很长一段时间也还是会是这样。 准备面试不等于耍小聪明或者死记硬背面试题。 **一定不要对面试抱有侥幸心理。打铁还需自身硬!** 千万不要觉得自己看几篇面经,看几篇面试题解析就能通过面试了。一定要静下心来深入学习! 这篇我会从宏观面出发简单聊聊如何准备 Java 面试,让你少走弯路! ## 尽早以求职为导向来学习 我是比较建议还在学校的同学尽可能早一点以求职为导向来学习的。 **这样更有针对性,并且可以大概率减少自己处在迷茫的时间,很大程度上还可以让自己少走很多弯路。** 但是!不要把“以求职为导向学习”理解为“我就不用学课堂上那些计算机基础课程了”! 我在之前的很多次分享中都强调过:**一定要用心学习计算机基础知识!操作系统、计算机组成原理、计算机网络真的不是没有实际用处的学科!!!** 你会发现大厂面试你会用到,以后工作之后你也会用到。我分别列举 2 个例子吧! - **面试中**:像字节、腾讯这些大厂的技术面试以及几乎所有公司的笔试都会考操作系统相关的问题。 - **工作中**:在实际使用缓存的时候,你会发现在操作系统中可以找到很多缓存思想的影子。比如 CPU Cache 缓存的是内存数据用于解决 CPU 处理速度和内存不匹配的问题,内存缓存的是硬盘数据用于解决硬盘访问速度过慢的问题。再比如操作系统在页表方案基础之上引入了快表来加速虚拟地址到物理地址的转换。我们可以把快表理解为一种特殊的高速缓冲存储器(Cache)。 **如何求职为导向学习呢?** 简答来说就是:根据招聘要求整理一份目标岗位的技能清单,然后按照技能清单去学习和提升。 1. 你首先搞清楚自己要找什么工作 2. 然后根据招聘岗位的要求梳理一份技能清单 3. 根据技能清单写好最终的简历 4. 最后再按照建立的要求去学习和提升。 这其实也是 **以终为始** 思想的运用。 **何为以终为始?** 简单来说,以终为始就是我们可以站在结果来考虑问题,从结果出发,根据结果来确定自己要做的事情。 你会发现,其实几乎任何领域都可以用到 **以终为始** 的思想。 ## 了解投递简历的黄金时间 面试之前,你肯定是先要搞清楚春招和秋招的具体时间的。 正所谓金三银四,金九银十,错过了这个时间,很多公司都没有 HC 了。 **秋招一般 7 月份就开始了,大概一直持续到 9 月底。** **春招一般 3 月份就开始了,大概一直持续到 4 月底。** 很多公司(尤其大厂)到了 9 月中旬(秋招)/3 月中旬(春招),很可能就会没有 HC 了。面试的话一般都是至少是 3 轮起步,一些大厂比如阿里、字节可能会有 5 轮面试。**面试失败话的不要紧,某一面表现差的话也不要紧,调整好心态。又不是单一选择对吧?你能投这么多企业呢! 调整心态。** 今年面试的话,因为疫情原因,有些公司还是可能会还是集中在线上进行面试。然后,还是因为疫情的影响,可能会比往年更难找工作(对大厂影响较小)。 ## 知道如何获取招聘信息 下面是常见的获取招聘信息的渠道: - **目标企业的官网/公众号**:最及时最权威的获取招聘信息的途径。 - **招聘网站**:[BOSS 直聘](https://www.zhipin.com/)、[智联招聘](https://www.zhaopin.com/)、[拉勾招聘](https://www.lagou.com/)......。 - **牛客网**:每年秋招/春招,都会有大批量的公司会到牛客网发布招聘信息,并且还会有大量的公司员工来到这里发内推的帖子。地址: 。 - **超级简历**:超级简历目前整合了各大企业的校园招聘入口,地址: - **认识的朋友**:如果你有认识的朋友在目标企业工作的话,你也可以找他们了解招聘信息,并且可以让他们帮你内推。 - **宣讲会**:宣讲会也是一个不错的途径,不过,好的企业通常只会去比较好的学校,可以留意一下意向公司的宣讲会安排或者直接去到一所比较好的学校参加宣讲会。像我当时校招就去参加了几场宣讲会。不过,我是在荆州上学,那边没什么比较好的学校,一般没有公司去开宣讲会。所以,我当时是直接跑到武汉来了,参加了武汉理工大学以及华中科技大学的几场宣讲会。总体感觉还是很不错的! - **其他**:校园就业信息网、学校论坛、班级 or 年级 QQ 群。 校招的话,建议以官网为准,有宣讲会、靠谱一点的内推的话更好。社招的话,可以多留意一下各大招聘网站比如 BOSS 直聘、拉勾上的职位信息,也可以找被熟人内推,获得面试机会的概率更大一些,进度一般也更快一些。 一般是只能投递一个岗位,不过,也有极少数投递不同部门两个岗位的情况,这个应该不会有影响,但你的前一次面试情况可能会被记录,也就是说就算你投递成功两个岗位,第一个岗位面试失败的话,对第二个岗位也会有影响,很可能直接就被 pass。 ## 多花点时间完善简历 一定一定一定要重视简历啊!朋友们!至少要花 2~3 天时间来专门完善自己的简历。 最近看了很多份简历,满意的很少,我简单拿出一份来说分析一下(欢迎在评论区补充)。 **1.个人介绍没太多实用的信息。** ![](https://oss.javaguide.cn/github/javaguide/interview-preparation/format,png.png) 技术博客、GitHub 以及在校获奖经历的话,能写就尽量写在这里。 你可以参考下面 👇 的模板进行修改: ![](https://oss.javaguide.cn/github/javaguide/interview-preparation/format,png-20230309224235808.png) **2.项目经历过于简单,完全没有质量可言** ![](https://oss.javaguide.cn/github/javaguide/interview-preparation/format,png-20230309224240305.png) 每一个项目经历真的就一两句话可以描述了么?还是自己不想写?还是说不是自己做的,不敢多写。 如果有项目的话,技术面试第一步,面试官一般都是让你自己介绍一下你的项目。你可以从下面几个方向来考虑: 1. 你对项目整体设计的一个感受(面试官可能会让你画系统的架构图) 2. 你在这个项目中你负责了什么、做了什么、担任了什么角色。 3. 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用。 4. 你在这个项目中是否解决过什么问题?怎么解决的?收获了什么? 5. 你的项目用到了哪些技术?这些技术你吃透了没有?举个例子,你的项目经历使用了 Seata 来做分布式事务,那 Seata 相关的问题你要提前准备一下吧,比如说 Seata 支持哪些配置中心、Seata 的事务分组是怎么做的、Seata 支持哪些事务模式,怎么选择? 6. 你在这个项目中犯过的错误,最后是怎么弥补的? **3.计算机二级这个证书对于计算机专业完全不用写了,没有含金量的。** ![](https://oss.javaguide.cn/github/javaguide/interview-preparation/format,png-20230309224247261.png) **4.技能介绍问题太大。** ![](https://oss.javaguide.cn/github/javaguide/interview-preparation/93da1096fb02e19071ba13b4f6a7471c.png) - 技术名词最好规范大小写比较好,比如 java->Java ,spring boot -> Spring Boot 。这个虽然有些面试官不会介意,但是很多面试官都会在意这个细节的。 - 技能介绍太杂,没有亮点。不需要全才,某个领域做得好就行了! - 对 Java 后台开发的部分技能比如 Spring Boot 的熟悉度仅仅为了解,无法满足企业的要求。 ## 岗位匹配度很重要 校招通常会对你的项目经历的研究方向比较宽容,即使你的项目经历和对应公司的具体业务没有关系,影响其实也并不大。 社招的话就不一样了,毕竟公司是要招聘可以直接来干活的人,你有相关的经验,公司会比较省事。社招通常会比较重视你的过往工作经历以及项目经历,HR 在筛选简历的时候会根据这两方面信息来判断你是否满足他们的招聘要求。就比如说你投递电商公司,而你之前的并没有和电商相关的工作经历以及项目经历,那 HR 在筛简历的时候很可能会直接把你 Pass 掉。 不过,这个也并不绝对,也有一些公司在招聘的时候更看重的是你的过往经历,较少地关注岗位匹配度,优秀公司的工作经历以及有亮点的项目经验都是加分项。这类公司相信你既然在某个领域(比如电商、支付)已经做的不错了,那应该也可以在另外一个领域(比如流媒体平台、社交软件)很快成为专家。这个领域指的不是技术领域,更多的是业务方向。横跨技术领域(比如后端转算法、后端转大数据)找工作,你又没有相关的经验,几乎是没办法找到的。即使找到了,也大概率会面临 HR 压薪资的问题。 ## 提前准备技术面试和手撕算法 面试之前一定要提前准备一下常见的面试题: - 自己面试中可能涉及哪些知识点、那些知识点是重点。 - 面试中哪些问题会被经常问到、面试中自己改如何回答。(强烈不推荐死记硬背,第一:通过背这种方式你能记住多少?能记住多久?第二:背题的方式的学习很难坚持下去!) 这块内容只会介绍面试大概会涉及到哪方面的知识点,具体这些知识点涵盖哪些问题,后面的文章有介绍到。 **Java** : - Java 基础 - Java 集合 - Java 并发 - JVM **计算机基础**: - 算法 - 数据结构 - 计算机网络 - 操作系统 **数据库**: - MySQL - Redis **常用框架**: - Spring - SpringBoot - MyBatis - Netty - Zookeeper - Dubbo **分布式** : - CAP 理论 和 BASE 理论、Paxos 算法和 Raft 算法 - RPC - 分布式事务 - 分布式 ID **高并发**: - 消息队列 - 读写分离&分库分表 - 负载均衡 **高可用**: - 限流 - 降级 - 熔断 ![](https://oss.javaguide.cn/github/javaguide/interview-preparation/20210414112925296.png) 不同类型的公司对于技能的要求侧重点是不同的比如腾讯、字节可能更重视计算机基础比如网络、操作系统这方面的内容。阿里、美团这种可能更重视你的项目经历、实战能力。 关于如何准备算法面试请看《Java 面试指北》的「面试准备篇」中对应的文章。 ## 提前准备自我介绍 自我介绍一般是你和面试官的第一次面对面正式交流,换位思考一下,假如你是面试官的话,你想听到被你面试的人如何介绍自己呢?一定不是客套地说说自己喜欢编程、平时花了很多时间来学习、自己的兴趣爱好是打球吧? 我觉得一个好的自我介绍至少应该包含这几点要素: - 用简洁的话说清楚自己主要的技术栈于擅长的领域; - 把重点放在自己在行的地方以及自己的优势之处; - 重点突出自己的能力比如自己的定位的 bug 的能力特别厉害; 简单来说就是用简洁的语言突出自己的亮点,也就是推销自己嘛! - 如果你去过大公司实习,那对应的实习经历就是你的亮点。 - 如果你参加过技术竞赛,那竞赛经历就是你的亮点。 - 如果你大学就接触过企业级项目的开发,实战经验比较多,那这些项目经历就是你的亮点。 - ...... 从社招和校招两个角度来举例子吧!我下面的两个例子仅供参考,自我介绍并不需要死记硬背,记住要说的要点,面试的时候根据公司的情况临场发挥也是没问题的。另外,网上一般建议的是准备好两份自我介绍:一份对 hr 说的,主要讲能突出自己的经历,会的编程技术一语带过;另一份对技术面试官说的,主要讲自己会的技术细节和项目经验。 **社招:** > 面试官,您好!我叫独秀儿。我目前有 1 年半的工作经验,熟练使用 Spring、MyBatis 等框架、了解 Java 底层原理比如 JVM 调优并且有着丰富的分布式开发经验。离开上一家公司是因为我想在技术上得到更多的锻炼。在上一个公司我参与了一个分布式电子交易系统的开发,负责搭建了整个项目的基础架构并且通过分库分表解决了原始数据库以及一些相关表过于庞大的问题,目前这个网站最高支持 10 万人同时访问。工作之余,我利用自己的业余时间写了一个简单的 RPC 框架,这个框架用到了 Netty 进行网络通信, 目前我已经将这个项目开源,在 GitHub 上收获了 2k 的 Star! 说到业余爱好的话,我比较喜欢通过博客整理分享自己所学知识,现在已经是多个博客平台的认证作者。 生活中我是一个比较积极乐观的人,一般会通过运动打球的方式来放松。我一直都非常想加入贵公司,我觉得贵公司的文化和技术氛围我都非常喜欢,期待能与你共事! **校招:** > 面试官,您好!我叫秀儿。大学时间我主要利用课外时间学习了 Java 以及 Spring、MyBatis 等框架 。在校期间参与过一个考试系统的开发,这个系统的主要用了 Spring、MyBatis 和 shiro 这三种框架。我在其中主要担任后端开发,主要负责了权限管理功能模块的搭建。另外,我在大学的时候参加过一次软件编程大赛,我和我的团队做的在线订餐系统成功获得了第二名的成绩。我还利用自己的业余时间写了一个简单的 RPC 框架,这个框架用到了 Netty 进行网络通信, 目前我已经将这个项目开源,在 GitHub 上收获了 2k 的 Star! 说到业余爱好的话,我比较喜欢通过博客整理分享自己所学知识,现在已经是多个博客平台的认证作者。 生活中我是一个比较积极乐观的人,一般会通过运动打球的方式来放松。我一直都非常想加入贵公司,我觉得贵公司的文化和技术氛围我都非常喜欢,期待能与你共事! ## 减少抱怨 就像现在的技术面试一样,大家都说内卷了,抱怨现在的面试真特么难。然而,单纯抱怨有用么?你对其他求职者说:“大家都不要刷 Leetcode 了啊!都不要再准备高并发、高可用的面试题了啊!现在都这么卷了!” 会有人听你的么?**你不准备面试,但是其他人会准备面试啊!那你是不是傻啊?还是真的厉害到不需要准备面试呢?** 因此,准备 Java 面试的第一步,我们一定要尽量减少抱怨。抱怨的声音多了之后,会十分影响自己,会让自己变得十分焦虑。 ## 面试之后及时复盘 如果失败,不要灰心;如果通过,切勿狂喜。面试和工作实际上是两回事,可能很多面试未通过的人,工作能力比你强的多,反之亦然。 面试就像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油! ## 总结 这篇文章内容有点多,如果这篇文章只能让你记住 4 句话,那请记住下面这 4 句: 1. 一定要提前准备面试!技术面试不同于编程,编程厉害不代表技术面试就一定能过。 2. 一定不要对面试抱有侥幸心理。打铁还需自身硬!千万不要觉得自己看几篇面经,看几篇面试题解析就能通过面试了。一定要静下心来深入学习! 3. 建议大学生尽可能早一点以求职为导向来学习的。这样更有针对性,并且可以大概率减少自己处在迷茫的时间,很大程度上还可以让自己少走很多弯路。 但是,不要把“以求职为导向学习”理解为“我就不用学课堂上那些计算机基础课程了”! 4. 手撕算法是当下技术面试的标配,尽早准备!