- 当前位置:
- 首页
- VIP_八股文
- VIP_训练营必看内容
- 正文
八股文高频题库(必看必看)
写在前面
强调:本文是常见高频题,一般掌握了就可以应付大部分公司,所以时间不是特别足够的,请优先按照本文来准备。
八股文内容太多了,我前面给的那些课程,最重要的作用就是大家学了之后能够理解,并且有个总体的把握,部分细节忘了倒没事,毕竟内容太多了。
所以说才去,总体把握=》面试题侧重点训练,所以这个八股文题库,就是给大家训练用的。
我会选取一些高频题,并且尽量附带详解讲解答案,供大家复习面试使用,大家看详细讲解的时候,一定要知道 why。
大家可以挑选着来看,反正没看过的就看一看,基本覆盖大部分面试题,下面帅地分类整理出来了,并且每道题基本独立互不关联,这样你就可以选择性看了。
注意,看的过程中,自己可以做一些笔记,做的时候,按照自己的习惯做哈,并不一定要和视频/文章讲的一样,你按照自己能够记忆的方法记哈,帅地是用思维导图记的,并且记的很简洁,具体可以看我之前的思维导图:帅地的秋招笔记
当然,面试题那么多,不可能全覆盖哈,只能说,高频题!!!
如果要想要全面的,看咱们这个超全面的八股文分析:八股文考点全方位分析(PS:适合学有余力的同志,否则该高频题库就够了)
如何阅读这些题
每道题我都会跟大家讲解你需要掌握的内容,让你内心有个概念,之后你去阅读我给的对应文章或者视频,然后把知识给消化了,之后自己简单总结一下。
请大家一定要按照我说的去阅读文章或者看视频,不要看那些答案很简短的内容,其实这些面试题你要简短的答案的话,帅地也有,而且还是免费的,但是我认为那种答案,你看了就忘了,看一百次也不会有新的领悟,所以我希望你看我总结的这些,而且你回答面试官问题的时候,也可以根据文章的思路去回答。
所以呢,请认真阅读下文章,去掌握why,之后自己总结一下笔记,消化成自己的。
如何回答面试官问题
我录制了一个视频,请大家看这个:如何回答面试官问题,这个必看这个必看这个必看,太多人不知道自己为何而挂,明明都回答了,但就是挂了。
如何做笔记
大家可以做一下笔记,帅地个人是推荐自己做笔记哈,不是直接 copy 别人的笔记,即使你觉得懂,觉得你也会这样写,你也不能复制,因为你觉得懂的,到了真正写的时候,还真久不一定能够写出来。
另外就是,笔记我希望大家记录的是自己的思考,而不是流水账,关于如何记笔记的,如果你感兴趣,也可以参考一下我说的:分享一下我是如何做笔记的
八股文题库训练说明
关于面试题,实在太多了,部分是帅地录制,部分是我找的视频,其实关于面试题视频,市面上也非常多,比如慕课网的 Java剑指offer,但是嘛,我很多都看过,感觉讲不出我想要的效果,所以很多视频我都没有选,而且现在八股文真的太泛滥了,到处都是面试题,但是很多质量都非常劣质,如果你要面试好公司,不建议你看那些,最好是按照我说的来。
不过呢,下面这些面试题,个人认为都是讲的非常好滴,不好的不会选,而是会自己录制,不过我也一直没空去录制,但是也请大家按照我说的来。
PS:标🌟越多,代表优先级越高
0、阅读顺序
可以先看java系列=》Java框架等=》mysql=>redis=>计算机网络/操作系统=》其他,总体也没有太严格的顺序
另外,点开链接不会新页面打开,你们可以右键打开链接
一、Redis
关于 Redis 我先说下面试考察形式:一般来说,如果你项目没有用到 redis,即使不学也没事,不过项目基本是需要用到 redis 的了,不然项目是真的空,如果项目有了 redis,那么面试官基本会问 redis。
不过面试官问 redis,基础的问的多,像集群,主从这种,会问,但是问的少,一般是先问你简单,看你觉得还行,才会一直问,有些会一直问到你不会。
关于学习资料:看书的话,可以看《redis设计与实现》+ Redis原理剖析阅读指南(新),当然,即使你直接看我总结的面试题也是可以的,如果你要面试互联网大厂,就可以刷一下我说的这些资料。
不过无论你看了哪些,我都希望你可以来看下我总结的这些面试题,并且每道题我都会说下大致怎么回答这些,当然,我不可能面面俱到哈,只能说给你们总结高频的题。
当然,如果你觉得懂,可以不看,但是没有把握的,都得看哈,面试题训练,这是训练营最重点的一个环节,大家认真看下,这块我花了很多时间弄的,每个视频和文章,都自己看过很多之后,筛选出来,无论你看不看,都要重视下我说的那些知识点。
1. Redis单线程为啥还能这么快?🌟🌟🌟🌟🌟:看完需要掌握如下
(1)、能够回答 memcached 与 redis 区别
(2)、redis 单线程为何还这么快,回答这个问题的时候,如果熟悉,就先扯下 redis 的线程模型,这样不会干巴巴如同死记硬背那样讲基于内存操作啊,线程切换开销啊,核心还是IO多路复用 + 基于内存,而这些都是基于 redis 的线程模型来发挥作用的
2. redis都有哪些数据类型?分别在哪些场景下使用比较合适呢?🌟🌟🌟🌟🌟:回答的时候,记得不要只说五种数据类型,还要说一说他们各自的应用场景,我给你们的项目中,也用到了 list 之类的,所以被问到的概率非常大。
另外,关于有序集合底层是基于跳跃表的,如果不懂跳跃表麻烦看这篇文章:别再问我什么是跳跃表了
其实很多东西都是互相关联的,如果你都能回答,那么就是大大加分,这也是我为何推荐大家多接触。
3、Redis持久化机制🌟🌟🌟🌟:这个视频几个图片有点模糊,适合快速复习,学完目标如下:
1、明白持久化的意义:主要用于故障恢复
2、自己可以跟着视频操作下 AOF/RDB 的配置以及执行下对应命令之类的,这样实操过,也比较有印象
3、掌握他们两个的区别和优缺点,本质就是一个保存命令,一个是保存所有数据,和 mysql 的日记系统有点像。
4、知道 RDB 的 bgsave 大致流程,了解 copy-on-write,知道什么时候出发 RDB 的 save
补充:这里有一篇快问快答 https://www.iamshuaidi.com/1515.html
另外,如果要看具体的,可以看书的,《redis开发与运维》关于持久化那块,很短,但是讲的挺清楚,这个视频你们当作复习吧,记得 4.0 支持混合模式。
4、redis实现分布式锁🌟🌟🌟🌟:自己可以简单实现下,还是有不少人被面试官问到,让他写个简单的分布式锁,一般大型的分布式锁用其他实现,redis的分布式锁适合小型/简单的,这里有一篇文章版,可以用来加深理解 :Redis实现分布式锁
5、redis实现消息队列🌟🌟🌟:这个了解下,知道 List 还能实现一个消息队列的功能,以及异步消息队列,咱们那个牛客网项目,以前有个类似的版本,就是用 redis 实现消息队列。
6、redis的过期策略能介绍一下?要不你再手写一个LRU?🌟🌟🌟🌟🌟:
1、了解定期删除和惰性删除的一些优缺点,并且记住系统是采用这两种方法结合。另外注意,过期不代表就会被删除。
2、掌握几种删除策略,特别是 LRU。另外,要会写 LRU 算法,这个我当时被被阿里问过,身边读者也有好几个被问过,所以面大厂的必须要掌握,拿捏算法课程里也有这个讲解:28. LeetCode146. LRU 缓存
7、你能说说redis的并发竞争问题该如何解决吗?🌟🌟:分布式锁的一个补充,这个还挺重要,被问过两次,就是对于缓存的更新,不是说加锁就行,核心还得加上时间戳,看这个视频希望大家能够明白这个时间戳的事情,其实我实习的时候,也用到了这个,不过我只是写个脚本,用 redis 当作分布式锁,并且加上时间戳。
8、缓存雪崩+穿透+数据库缓存一致性问题🌟🌟🌟🌟🌟:看完掌握如下:
1、缓存雪崩和缓存穿透,这个问的实在太多了,不过不难,说一说啥是雪崩和穿透 + 如何解决就行。
2、缓存与数据库双写一致,这个有点 难,比较烧脑,常见策略就两种,先删缓存再更新数据库和先更新在删除,每一种都有优缺点,我之前在腾讯实习,业务用的是先更新数据库再删除缓存,如果缓存删除失败,也没理了,一是业务允许存在一些延迟,不用卡的那么死,二是 30 分钟会刷新所有缓存。
哈希扩容:rehash下(源码剖析)🌟🌟🌟,这个我给大家准备了两篇文章,你先看下基本原理,之后看下源码实现,源码不难,注释也写的很清楚。
因为 Java 中 HashMap 也有扩容,而 redis 的扩容是和它完全不一样的,所以有可能会被问到,目标:
1、掌握 redis 和 Java 中扩容的区别,redis 有两个数组,主要用于渐进式扩容
2、掌握渐进式扩容原理,之所以需要渐进,主要是为了分摊扩容的压力,不然数据太多,太消耗时间,那么 redis 「快」的性质收到影响,所谓渐进式,就是把扩容分担到多次操作中。
3、大家掌握了原理,最好可以看下源码,看源码是个不错的加分,到时候你在回答面试官的时候,也可以暗示面试官自己研究过源码,比如回答的时候说:这个我之前有简单看过源码实现,我给您大致讲 一下过程 吧。
这些都是回答的技巧,反正面试的时候 ,最好是把自己会的表达出来,不然就白研究了是吧,还是那句话,面试官更多是想挖掘你会什么
10、分布式一致性算法:leader选举🌟🌟,这里划分为哨兵的知识了,也就是 redis 主从复制的知识,这个我京东面试也被问过,建议大家了解下,一方面是可以拓展思维,一方面以防被问到。
主从复制的问题很多,这是其中一块被问到最多的问题了,就是选举一个主节点的策略,这里我只介绍了Leader的选举,和日志复制的概要流程,面试官问起,你这样简单介绍就可以了,如果想深入了解,可以看这里:哈希一致性算法
二、MySQL
关于 MySQL 我先说下面试考察形式:基本必问了,一般就问理论了,索引问的最多,并且个人认为 mysql 不会问的很难,不过细节很多,有时候被问到不懂的细节,就认栽吧,另外有时候还会让你写下简单的 sql 语句。
最稳的准备方式:
理论:索引,锁,事务,日志这些。
手写sql语句:简单的语句,牛客网有一些练习,可以刷一刷,怎么着也要刷 10+ 道:SQL练习🌟🌟🌟🌟🌟
实战:会分析 sql 的性能,就是要会用一些命令去分析,一般就这几个(我秋招总结的,explain最重要):

考察难度:根据我的观察,大部分情况下,考察都比较中规中矩,不怎么难,可能事务和日志相关的会难一点,但是更多的还是问索引
关于学习资料:有基础直接看 MySQL原理剖析课程,不过单独看这个还不够完整(另外主从备份那里随便了解下就行,被问到就认栽吧),毕竟一个专栏不可能面面俱到,那对于一些重点且专栏没有的,我下面给你们找文章总结了。

注意注意注意:以下必看,即使不看,也要看我提到的点,整明白我提到的点,如果你整明白了,那么大部分都可以应付了。
以下很多文章来自咱们的 Mysql 专栏:MySQL原理剖析课程,不过我强调了需要注意的点,其实 mysql 会考的内容也不是很多,下面总结的是比较高频的考点,不会面面俱到哈,不然就不适合快速复习了
索引模块(最最重要)
泛问题:说一说索引:这里强调下,很多面试官会让你说一说索引,这是属于泛问题,按照我说的,把你懂的,流畅给我扯出来,你先去给我准备一个模版扯。
一、为什么MySQL数据库要用B+树存储索引?(必看)🌟🌟🌟🌟🌟:
看完明白为啥用B+树,为啥不用B树,红黑树,哈希表这些,下面是两个重点且容易没说到的点:
1、减少磁盘操作:B+树非叶子不存 Value,指存放 key,所以一次更可以加载更多节点,减少磁盘加载到内存的次数
2、范围查找更多优势:mysql经常有范围查找,B+树的叶子结点之间是一个双向链表,很好支持范围查找
3、查找速度快:B+树类似一个多路的树了,所以同样节点,树的高度更低,查找速度更快(当然,更重要的点依然是减少)
其他的不做强调。
补充:不懂 B 树的,学一下 B 树,有时候可以扯到为啥用 B+ 而不用 B,并且顺便问你 B 树的应用,比如问啥文件系统用 B 树,看这篇(不懂的一定要看):高频面试题:什么是B树?为啥文件索引要用B树而不用二叉查找树?
二、
目标:
1、不多说,基础概念的普及,普通索引,主键索引以及他们的区别,核心区别就是叶子结点一个存放主键,一个存放一整行内容
2、覆盖索引,回表你得懂,最左匹配原创,索引下堆都得懂,里面也有对应的例子
三、MyISAM与InnoDB的索引,究竟有什么差异?🌟🌟:掌握他们的索引底层实现的差异,另外,InnoDB与MyISAM的差别也要掌握啊,比较关键的就是 InnoDB 支持行锁和事务,而MyISAM不支持。
锁
一、行锁、表锁和全局锁两这篇: 全局锁和表锁 + 行锁功过:怎么减少行锁对性能的影响?🌟🌟🌟🌟,如果面试官问你有哪些,你在介绍的时候,顺便举一下例子,比如什么时候会牵扯到行锁。
注意点:另外记得 MyISAM 不支持行锁,并且要注意,行锁是锁在索引上,具体可以看这篇:行锁到底锁住的是什么?记录?字段?索引?,回答行锁的时候,可以强调一下,不过你得懂哈,如果面试官问你细节,你懂,那么加分,不然就是踩坑。
二、InnoDB七种锁🌟:上面那篇只说了三种,其实细分到话有很多种,这篇作为一个补充了,比较重要的是间隙锁,如果面试被问到有哪些锁,你记的住的话,也可以说着七种了,当然也可以不说其中了,简单列几个你觉得自己掌握了的就行,并且最好的给出例子。
三、一条sql执行的很慢的原因有哪 些🌟🌟🌟🌟🌟:看完能够回答 sql执行的慢的原因,一般就是等锁,等 flush,没走索引,没走所以又分为 sql 本身问题 + 系统统计出错,可以按照玩文章的思路回答,另外,要自己会用 show processlist 命令查状态 + 用 EXPLAIN 查看 sql 语句的执行计划,有时候面试官会问这些命令
四、为什么我只改一行的语句,锁这么多?🌟🌟🌟:有时候面试官会问你执行 sql 语句会加哪些锁,一般不会问很难,就问一些简单的 sql,希望你看了这篇文章,可以掌握一些基本的。。
五、幻读是什么,幻读有什么问题?🌟🌟🌟🌟🌟:能够解释什么是幻读 + 如何避免幻读
日志与事务
1、看完知道 redo log 和 binlog 的区别,另外 redo 是 InnoDB 引擎特有的,而 bingo 是所有引擎共有
2、掌握为啥需要两阶段提交,这个其实有点难,这个还和事务有关,关于这个两阶段提交,可以问的很深,大家一定要想通一个问题:那就是事务是如何保证一致性的,
事务隔离:为什么你改了我还看不见?🌟🌟🌟🌟:记住几个事务不难,难的是掌握它的实现原理,大家可以多看两次,如果能掌握就尽量掌握,就掌握文中可重复读的原理就行,掌握不了也没事了
其他
如何用 explain 来分析 sql 的性能🌟🌟🌟🌟🌟:目标
1、掌握学会用 explain 来分析 sql 的执行计划
2、居然要分析,那就是掌握 type 参数的含义,所以掌握常见 type 参数含义,自己在命令行玩一玩哈,这个explain在工作上也经常用
补充:分析 sql 又一关键字段:Extra🌟🌟,这篇也看看,那么分析 sql 基本搞定
技巧:反正有机会你就扯这两个,说一说自己是如何用这个命令 + 这两个关键字来分析 sql 语句的,比如在项目中的数据库要执行一个 sql 语句时,对于不确定的 sql 都会先用 explain 分析下。
数据库允许空值(null),往往是悲剧的开始🌟🌟:null 在数据库是个特殊的值,得好好了解一下,比如能 =null,而是用 is null,比如 null 有没有建立索引啥的
常用命令总结:得掌握这几个

这两篇也掌握下:
进阶
有条件的同学,主从复制 + 分库分表也看下,主从复制的话,咱们那个 mysql原理剖析有,分库分表则没有,看这几个视频就行:
1. 体验一波分库分表连环炮
三、设计模式+框架
由于内容较多,我分类出来汇总了,全部面试题汇总的看这里:八股文题库(必看)
我把框架和设计模式放到一起了,因为我觉得回答设计模式的时候,最好是结合框架来回答是最好的,有很多例子,这样可以体现你真的学过。
下面我说一说需要掌握的点 + 给出对应的复习资料,这方面
一、框架 + web + 设计模式考啥
我知识星球强调过很多次,在校招中,这方面其实问的不多,重点还是基础,不过偶尔会基于你的项目来问一问,下面我跟大家说一下一般问啥,你们把我说的当作重点来复习哈。
1、设计模式:设计模式问的很容易的,就让你简单说一说有哪些设计模式,举一些例子,或者直接让你说一说某个设计模式,除了单例模式,其他不会让你写代码,不过单例模式,你最好是会写代码,一般只需要掌握 6 个设计模式(优先级排序):
- 单例模式(非常非常重要,得会写常见几种)
- 代理模式(也比较重要,主要知道他的应用)
- 工厂模式(也比较重要,主要知道他的应用)
- 观察者模式(知道下应用和大致原理就行)
- 模版方法模式
- 适配器模式
系统资料:Java设计模式观看指南
主要这几种,下面会给出一篇 Spring 框架的文章,里面把这几种都说了
2、Javaweb:基本就问下 cookie 和 session,以及 servlet 的一个请求流程,重点复习下 cookie 和 session 问题就行,咱们的项目也用到这些了,难点就是如何解决单点登录问题,也就是所谓的单点问题。
3、框架:框架基本就问 Spring,并且基本就问 IOC 和 AOP,其他问的少,有的话就问下事务相关,MyBatis 也是问的非常少吧,还有可能 就是问下你对 SpringMVC 的理解以及springboot和spring之类的区别。
二、复习材料
这一块我大部分找了视频,主要是视频里,老师会带着大家去实践一下,我觉得可以帮助大家更好理解,并且对于重点的,我也给了文章,文章可以更加深入去理解一些东西,我希望对于 IOC 和 AOP,大家可以明白他们的本质。
另外,还是那句话,我希望你能够好好重视我给的资料,重视我说的知识点,不要一股闷头在学习自己的。当然,业余之前,你有时间就多看看不同版本的讲解,加深理解。
设计模式
Spring 设计模式总结(文章)🌟🌟🌟🌟,面试官问你设计模式的时候,你有时候可以举例子,就从 Spring 这里举例子,当然,你有其他的例子也行,最好是实际存在的,不是比喻。
单例模式🌟🌟🌟🌟🌟:掌握双重检测机制 + 用volatile防止指令重排序问题(知道为啥不加volatile会出现线程不安全)
漫画:什么是 “代理模式” ?🌟🌟🌟🌟:这个也会问的多一些,比如mybatis里就用到了代理模式
其他一些设计模式:
其他的考察比较少,不过大家还是得了解一些,这样当面试官问你了解哪些设计模式的时候,你才能说。
Java web
面试题:给我说一下你项目中的单点登录是如何实现的?(文章)🌟🌟🌟
cookie和session你们相关用过,应该不用强调了,难点是单点登录问题,我还被阿里问过几次,大家可以看下这两篇文章,特别是第二篇,提供了详细的解决方案,第一篇当作简单版的概念普及吧,如果这个能很好回答,肯定加分。
Servlet生命周期(视频)🌟🌟
请求与响应的结构(视频)
JSP九大内置对象(视频)🌟:这个大公司基本不问了,不过有些小公司可能会问下
Statement和PreparedStatement的区别(视频)🌟🌟
框架
大厂框架考的少,一般掌握了 IOC 和 AOP,就掌握了半壁江山,其他的,有时间就了解下吧;非大厂的,可以都好好看下。当然,大家都可以看看了,都是视频,时间不长,就简单扫描一下。
我秋招时,就是看了这两篇之后,基于这两篇去回答面试的到,你们可以看看
Spring 的本质系列(1) — 依赖注入(文章)🌟🌟🌟🌟🌟
IOC与DI的理解(视频):IOC 就是控制反转,要注意这是一种思想,所以控制反转,就是本来是 A 控制 B 的,现在变成由 B 来控制 A 了,控制权被反转了,回答的时候,你就先给面试官解释下控制反转的含义,之后说一说依赖注入啥的,总之就是,把自己懂的尽量流畅表达出来吧。
Spring、SpringMVC与SpringBoot的区别(视频)🌟
**文字版本**:这里也有总结了spring常见的面试题:Spring面试突击
四、Java相关
1、Java基础
Java 内容很多,我把它分成了四大块:Java基础 + 集合 + 并发 + JVM。其中 Java 基础相对简单,不涉及源码之类的,或者有涉及也比较简单,不过并不意味着可以忽略,有时候一个简单的问题不懂,往往是致命的。
所以呢,我希望大家可以花点时间,扫盲一下,比如异常,String,面向对象特性,多态,重载重写区别,等等,这些都 比较简单,平时的课程也都是有讲到了,所以大家可以快速扫一下,就当作复习 + 补充细节。
比较重要的几个点是:
1、String 相关的知识,比如常量池,new String(“aa”) 会创建几个对象
2、StringBuilder 和 StringBuffer 的区别
3、hashCode 和 equals 区别
4、Java 特性,比如三大特性,如何实现跨平台。
这方面的内容不难,主要靠平时的一个积累,我找了一些视频学习资料,大家扫一下,然后做一下笔记就行,不像集合,并发这种需要很强的逻辑,这块我详细大家大部分听听就懂的了。
相关资料
Java基础已更新,看这些即可:Java基础突击八股文
2、Java 集合
集合的内容其实也不多,除了 HashMap 需要去深入了解,其他的,问的都是比较简单,比如 ArrayList 和 LinkedList 区别啥的,这些都比较简单,即使问 HashSet 也不难,因为 HashSet 底层实现就是 HashMap,所以又回到了 HashMap 了。
而基于 HashMap,可以延伸的东西就很多了,比如底层涉及链表 + 数组 + 红黑色,又涉及到线程安全问题,又涉及到扩容问题,又涉及到 HashCode 的生成问题,等等。
所以呢,对于集合,我们先总体把握集合整个体系,之后对 HashMap 去做一个深入了解,下面我总结了一下资料 + 对应的考点
Java集合已更新,直接看这个即可:Java集合突击八股文
3、JVM
JVM 的内容说多也多,说少也少,因为 JVM 在面试时,绝大多数就是问你类加载的双亲委派机制 + 运行时内存划分区域 + 垃圾回收,其中垃圾回收,存在很多不确定性,因为这玩意说难不难,但是知识点很多,背或不背,是个问题,所以我是建议你根据自己的时间来。
一般来说,看周志明那本《深入理解 Java 虚拟机》就差不多够用的了,然后我也找了个专栏,之前我看过这本书,也看过极客时间的虚拟机,也看过中华石衫的 JVM,那我觉得中华石衫的 JVM不错,非常适合当作复习,你们可以拿这个专栏复习(内容不多)
从零开始带你成为JVM高手
然后你们根据自己的情况,来选择要不要看书,要不要看专栏,那我的建议是,有时间就都看吧,多看看总归没坏处,加深理解。
下面我说一说一些高频考点的资料,大家看的时候,做个简单的笔记就行了,这块除了垃圾回收,其他都比较好记,如果你们JVM 0 基础,可能直接看面试题不好看懂,我这里推荐看下这个专栏:从零开始带你成为JVM高手
然后看突击版本的JVM来复习:JVM突击八股文
下面是一些视频,其实和专栏的内容差不多,你们想看也可以,如果看不下,不看也可以,当然,有时间的还是可以看看。
后面的话,大家如果学了,但是不知道掌握的如何,可以通过我模拟面试来判断自己掌握的如何
4、多线程 + 并发
说实话,如果并发往深考,并发可以非常非常非常难,应该是所有八股文中,最难的一个点了,并发细节真的很烧脑!!!
如果你觉得学有余力,那么你可以看咱们这个专栏 Java并发编程课程 + 《Java并发编程艺术》,咱们的高频题里,就不涉及太多那种很难的知识了。
咱们的高频题给出 多线程基础 + 并发基础,一般来说,Java并发不会问的很深和很细,更多的是会结合你项目安全相关的来问你,而且我说个实话,面试官很多也都忘了,所以更多的是会问你大致原理,比如线程池有啥用,线程数是越多越好吗?等等。
所以我觉得,Java并发大家先优先掌握 CAS + synchronized + volatile + 悲观锁/乐观锁 + 线程池 + 死锁案例 这些就差不多了,如果你学有余力,再去看我上面说的专栏和书籍了,咱们这里,就让大家掌握最基础的。(AQS学有余力再去考虑掌握)
下面我详细说一说考点 + 给一些资料吧。
PS:这里建议把 Java并发编程课程 前 11 节看完,都是并发基础
多线程基础(优先掌握)
多线程基础这部分是比较简单的,咱们主要需要掌握诸如 start 和 run 方法区别,Thread 和 Runnable 区别,sleep 和 wait 区别等等,对于这部分,你一定要自己去用一用哈,因为这些不怎么难,回答的时候也是简单回答就行,自己用过可以理解的更加深刻。
有时候你并发不懂没事,因为确实难,但是连最简单的多线程都不懂,可能是致命的
线程的start和run方法的区别:run 就是个普普通通的方法而已,而 start 这个方法才会调用相关的 函数去创建一个子线程
并发基础(优先掌握)
synchronized + volatile关键字指南:大家应该在代码中很早就接触 synchronized + volatile 了,大家可以先通过文章之类的,看下大致原理,之后再看看他们是怎么加锁的,大家其实可以写个最简单的 Java 程序,然后看一下他们的字节码,这是最好理解的,到时候面试官问起来,你说自己看过字节码,跟他解释,那就是大大加分。
IDEA 看字节码很简单,不需要反编译啥的,我给你们找来对应文章了:使用intellij idea 查看Java字节码
下面是关于这两个关键字的相关资料(给了文章 + 视频,在看视频,视频在最下面一起给了,你们可以先看下文章,看看能不能看懂)。
悲观锁/乐观锁:这些比较简单了,Java有很多锁,看我这篇就够了:一句话撸完重量级锁、自旋锁、轻量级锁、偏向锁、悲观、乐观锁等各种锁
volatile:一文搞懂volatile关键字,另外这个关键字不是 Java 特有的哦。
synchronized:注意它锁的是对象,看这篇文章:一文读懂synchronized
CAS:所有的并发的底层,都是基于 CAS,大家先掌握 CAS,看我之前写的文章:CAS 是什么?Java8是如何优化 CAS 的?
死锁:这个也简单了,就是有时候面试官会让你用代码写个死锁案例,大家记得自己写一下哈(记得写),这个我就不给出资料了,大家搞个类似的案例哈。
线程池:线程池我需要强调一个问题,就是麻烦大家想清楚下面这两个问题(因为基本必问,但是很多并没有答好,我希望大家 好好想一下):
1、线程池中的线程是越多越好吗?
2、为什么线程池可以加快速度?
入门看这篇了:图解 | 你管这破玩意叫线程池?
AQS:这是一个难点,大部分并发包都是基于 AQS,而 AQS 基于 CAS,关于 AQS 其实有点难的,需要多看几篇文章了,我给大家找了很硬核的文章(不过AQS得多折腾几次才能搞懂的了):从ReentrantLock的实现看AQS的原理及应用
几个重要的同步类:主要是这几个了,可以了解一下
- ReentrantLock
- CountDownLatch
- CycliBarrier
- Semaphore
我这里写了一篇极简入门的,当时看了源码之后总结了一波:Java并发包中最重要的几个同步类
下面是几个视频(和上面的多线程基础是一套的),但是我觉得并发这块,视频可能反而不容易懂,毕竟有的绕
最后,大家加油勒,有时间就多看几个不同的讲解版本吧,有些东西,只有多看几次,才能理解且掌握勒
五、计算机网络
计算机网络需要记住的东西还是比较多,有一部分东西需要去记忆,比如状态码,put/get区别等,而有一部分需要去理解,比如浏览器输入 URL 到网页展示的过程经历了哪些步骤。
计算机网络考什么?
计算机网络有一部分有可能会问的比较深,不过大部分是不会问很深,会问的比较深的一般是这两个:三次握手和四次挥手,这个有时候会问的很细,比如你遇到一个对三次握手比较懂的面试官,他会问你状态码的变化时的一些问题,而且还是一连串的,比如 TIME-WAIT 状态码为啥要等待 2ML,如果有很多 TIME-WAIT 会有什么影响?你觉得是什么原因导致的?如何解决?
有时候就问的比较简单,就让你说一下三挥挥手/四次握手这个过程各个状态码的变化。
有些则需要去理解,比如 HTTPS 为啥就是安全的呢?数字证书为啥就能证明一个人的身份呢?
总的来说,计算机网络可以考的知识点非常多,并且不同的面试官,爱好也可以不同,不过呢,无论它考的多深,很多时候都会从常考高频题出发,之后一步步拓展,我下面就给出学习资料 + 高频考点吧。
学习资料推荐
看书:如果有时间,其实我挺推荐看书,就先看《图解HTTP》,在看《计算机网络自顶向下》这两本 + 计算机网络入门阅读指南 + 我总结的 计算机网络面试题 + 下面总结的高频考点。
不要觉得很多,其实不多,除了 《计算机网络自顶向下》可能花时间一些,其他还是很快,这本可以帮助你们理解一下东西。
看视频:就看咱课程体系的 计算机网络课程说明 + 计算机网络入门阅读指南 + 我总结的 计算机网络面试题 + 下面总结的高频考点。
PS:时间不够的,可以优先看我下面总结的题。当然,时间够的,也可以看看你有没有遗漏的。
高频题
一般面试官都会先从你最熟悉的高频题问你,给你缓一缓,高频题无非就是 HTTP 和 TCP 以及 UDP,下面文章 + 视频,相互补充,我觉得可以先看视频再看文章,文章主要加深理解以及你们可以根据文章的思路来回答。
文章:
计算机网络五层模型入门:看完能够回答计算机网络五层模型 + IP 地址与 MAC地址的区别 + 子网掩码的用处 。有些你可以按照我文章的思路来回答,比如一步一步推导,一个一个引出来,另外这里说下,IP处于网络层,主要用来寻址,如同我们的快递的地址,而MAC用来唯一确认身份。
如果让你来设计网络:这篇仔细阅读,多读两遍,串联各种计算机协议。
小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?:超高频,看完跟着这个思路回答就行。
以上上篇,属于超级重点,要多阅读几遍,算是理解计算机的基本盘。
什么是 TCP 流量控制:看完能够回答啥是 流量控制,要注意它和拥塞控制的区别哈
什么是 TCP 拥塞控制?:看完能够回答啥是 TCP 拥塞控制,要注意它和流量控制的区别哈
为什么需要三次握手?两次不行?,高频考点
为什么需要四次挥手?三次不行?,高频考点
在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?,回答的时候,先保证思路清晰,再尽量详细,切勿说的很乱,这个时候即使详细但乱,也不大好。
如何区分LAN,WAN,WLAN ,VLAN 和VPN?:这个考的不多,不过我觉得可以了解下
视频:怎么说呢,我觉得有些很细的东西,看视频可能不好做笔记以及停下来思考,所以我觉得,视频就当作补充一些细节以及加速下理解吧
网络基础知识讲解:这里讲了基础知识 + 网络七层模型,上面文章是讲五层模型。回答七层的时候,你也可以按照视频老师讲的回答,比如每一层解决什么类型的问题之类的。
TCP的三次握手:至少记住下每次握手的状态变化。
TCP的四次挥手:和三次握手类似, 另外有个经常回问的,就是TIME_WAIT 这个状态码相关的东西,比如为啥需要等待 2ML,出现很多的 TIME_WAIT 的原因有可能是哪些?
TCP和UDP的区别:了解下他们的应用场景,有时候面试官还会问比如登录 qq 用到了哪一种协议?(两种都用到了)还有一个很高频的问题,就是如何让 UDP 实现可靠传输(其实就是在UDP的上层实现确认-重传协议就可以了,我写过:通信双方如何保证消息不丢失?)
TCP的滑窗:了解下大概,这个挺重要。
HTTP相关:状态码+get/put区别+报文大致格式+版本区别,等等。
HTTP和HTTPS的区别:对于 HTTPS 的加密,也要掌握对成加密,非对称加密这些,这篇文章可以加深理解:什么是 HTTPS?
socket相关:建议自己动手写个 Java
其他的,看这个突击版本 计算机网络面试突击 。
六、操作系统
进程之间的通信有哪些?:看完能够回答 进程之间的通信有哪些 这道面试题
进程与线程的区别:看完能够大致回答他们的区别,其实它们是两个完全不同的东西,回答时先说出进程相当一个容器,而线程只是里面的一个东西,并且程序本质是线程在执行,基于这个,再去回答他们的其他区别,比如通信,内存结构,等等,不要按照网上那些回答。
大家还有一个线程之间的通信方式也优先关注一下
另外就是关于操作系统的面试题,可以看看这个我总结的吧:操作系统面试突击
七、Linux补充
八、消息队列(做完项目看)
关于消息队列,如果你项目用到了,那么就必须得看了,把这几个视频看完,就差不多了。
一般来说,你把咱们 SpringBoot+MQ+ES项目做完,那么就可以 把这些消息队列面试题刷一下,刷的时候,做一下笔记。
下面是我们项目相关的:
kafka牛客网和B站用到,有时间可以深入学一下,这里有常见面试题:Kafka常见面试题,有时间也可以跟着里面系统学习一下哈。
RabbitMQ 的话,我们的电商支付项目有用到,有时间也可以跟着这个视频系统学习,或者只看高频题:消息队列RabbitMQ
九、关于分布式相关
分布式和消息队列一样,一般都是基于项目来问的,看这个:分布式课程_常见分布式问题以及解决方案
注意,分布式中大厂问的越来越多,对于如下知识,要尽量掌握
1、分布式缓存
2、分布式事务
3、分布式限流与降级
4、分布式回话
5、Paxos算法+分布式锁。
PS:分布式不要求啊,我说的掌握50%可以投递简历,是不包含这个课程哈