📌Java后端秋招准备指南
Java后端各科最全八股自用整理,获取方式见
:
一、秋招看的书籍
书籍/课程 | 推荐程度 | 备注 |
---|---|---|
02-Java核心技术面试精讲-极客时间 | 很不错的课程,条理化具备了。 | |
88-高并发系统设计40问 | 不错的课程,可以看看用来对分布式相关有个概念 | 之前记错了,刚翻笔记发现这门课还不错 |
Java并发编程的艺术 | 并发讲的还算可以,但是有些老; 这方面目前没找到别的比较好的资料 | 实在读不下去可以试试老外的并发编程的实践。 |
MySQL必知必会 | 复习SQL语句很好,可以很快过完 | |
06-MySQL实战45讲 | 一定要看,拿下这门课,MySQL面试官基本问不住你;很多时候你甚至可以拉着他分析 | 有的章节难度大,建议反复看看。 但是join那里过过就行了,面试官不太问 |
Redis深度历险:核心原理和应用实践 | 值得读,不是特别细节化,对Redis来说够用了 | 要是最后Redis方面还是扛不住面试官,整整Redis设计与实现 |
剑指OFFER | 最起码刷一遍 | 面试过程中很多原题的 |
深入理解Java虚拟机 | 一定要看,有些章节我看了不止一遍 | 但是机器码啥的那块就不用多看了 |
图解网络-小林 | 严格来说不算书,一个博主的博客集合,值得一看 | 我的HTTPS大框架最后就是这个书里看懂的 |
图解系统-小林 | 过知识点比较好 | |
advanced-java | 比JavaGuide之流强多了,分布式知识可以看一遍这个,比较系统化 | github上的开源项目 |
05-趣谈网络 | 好课程,网络把这个拿下,网络方面别人问不住你 | 后悔时间晚了点才知道这门课,那时候秋招都结束了 |
二、建议
-
小公司很多其实没必要面,爱乱问,问的东西没有任何参考意义。
-
阿里会抓着你问原理,对算法反而不看重。但是原理会抓着你问。很难混进去(当然有幸存者偏差,阿里应该也有不太行的部门)。
-
腾讯面试官很参差不齐,有技术大拿,但是我也碰见过一边打游戏一边面试我的人,很无聊。
-
美团喜欢问你原理的细节,有时候确实没考虑到,比如问你不可重复读和脏读的区别,大部分公司都是问你幻读和不可重复读的区别。
-
京东面试很迷,好多时候都回答上来了,但是最后挂了。最后的秋招的物流面试还行,没让你回答八股文,先给你一个简单的场景让你实现,然后一步一步复杂化。
-
博客写起来,但是不建议写流水账,也不建议写的和笔记一样,要有自己的思考。
简历上附上自己的博客和github或gitee
。github或gitee上个人主页的贡献度亮起来,因为好多公司很无聊,喜欢问你代码行是多少,这时候可以把这个截图给他。 -
附上几个比较厉害的公众号
-
算法:宫水三叶(我后期刷每日一题好多不会都是看三叶姐姐题解)
-
技术:美团技术团队(强推,质量很高),架构师之路(时水时不水,topk问题就是他给我回答了),码农的荒岛求生,techGuide(经常复盘笔试题,明年不知道还会不会),小林coding,很多技术文章可以去掘金社区,知乎上很多高质量文章都是搬运掘金的
-
小工具: codetop,一个网站,按公司部门面试频率分类算法题
-
校招薪水:到时候会总结各公司的薪酬档次
-
应届生职前菌:招聘信息大汇总
-
offershow小程序:可以查薪资
-
各大公司作息:一个在线文档,能看到很多公司和部门的作息,但老被举报,试试
WorkingTimes
小程序 -
微软To Do:代办清单啥的,用着特别爽,把面试不会的知识点放上去,一个一个消灭。
三、知识点篇
1.关于框架。
-
这块并没有整的很明白,但是
AOP、IOC
这种高频还是得弄明白。 -
其实这两个概念,特别是IOC已经很复杂了,一时半会不是那么能懂的,建议从知乎、掘金上慢慢看,一个概念一个概念解决(控制反转、依赖注入等),知乎上虽然有些大佬能起到醍醐灌顶的作用。
2.开源组件
- ZooKeeper、NginxDub、dubbo之类是加分项,能会最好,但是学生时期并没有并发的场景,面试官也能理解,对这些要求并不高。
- 建议把互联网常用的那些组件大概明白是用来做啥的就行。但是消息队列建议还是尽量去用用,上手容易,面试官会问。
3.设计模式
- 这块我也没太整明白,特别是开闭原则这种,我只理解了一部分,有些公司倒是爱问这些,个人觉得有个大概了解就行。
4.基本知识
-
操作系统和网络一定得拿下,面试官很爱问,但是除了常见高频问题外,有些内容很见功力,比如HTTPS,异步IO这些。
-
至于组成原理啥的我觉得没必要复习,除了字节和滴滴有一次问我这些神奇问题外,别的家都没问过。
-
很多面试官容易问的显而易见的知识点,其实有很多东西可以挖。
-
比如常见的TCP中的拥塞控制,我们书本中学得那一套即慢启动啥的叫RENO算法,业内谷歌还开源了一套BBR,可以有效降低传输时延,并保证较高的吞吐量。
5.HashMap和ConcurrentHashMap
- 知识点很多,扩容时机,为什么用红黑树],为啥要求初始化是2的次方,然后比较偏的就是为啥默认大小是16,链表>8时变红黑树。源码里写过,是在泊松分布的二项分布下通过0.75的负载因子算出来的。
- 可以看看我写的这两篇博客,都是干货👉👉集合(上)与👉👉集合(下)
6.常见逻辑题的总结
- 现在很多面试官喜欢整赛马、称小球这些题。
7.很多知识点比较复杂,可能得花很长时间,经常反复才能会,比如异步IO,除了多去掘金上看经典博客以外,可以翻翻经典的书,比如我真正理解finalize是看了《Java编程思想》中这里的章节。
- 总之把握两个方面:如果一个知识点特别难懂,不是历史原因,就是你切入点的问题。 比如异步IO你要是从语言角度去切入,很难理解,从操作系统切入就很容易。
9.场景题是最难整的一种,不好说,但是一些经典的需要明白。
- 如:微信扫码登录、游戏排行榜啥的、分布式锁的两种实现(Redis实现和ZooKeeper实现的区别)。
下面是需要看的一些知识点的提纲,每一个都应该深入理解。最后达到可以自己不借助任何资料写出来这些提纲,面试说的时候就基本不会卡壳,也就可以自己延伸一些话题,把握面试的主动权。所以最重要的还是知识要成体系。
一开始学快速总览全局,之后深入每一个细节,最后还要抓住每一个模块的重点整理出自己的知识框架,就可以去面试了。
四、重点
1、JAVA
1.1 基础
-
面向对象和面向过程的本质区别,SOLID原则,面向对象的特性。
-
接口和抽象类的区别
-
字符串常见的问题,以及不同版本中新建字符串时候的区别。
-
包装类和基本类型的自动装包拆包,包装类的缓存,互相转换方法
-
final修饰变量,方法,类。transient作用。
-
Object的方法以及使用注意
-
泛型实现原理、泛型擦除
-
异常:继承体系,try catch finally 谁可以省略,return在某个地方是否会执行
-
反射:原理(动态获取类或者对象的字段以及方法,可以获取private字段)
-
动态代理:JDK和cglib的实现原理区别,性能对比,spring里面默认什么,如何切换。
-
新特性:8 的lamda和Stream,方法引用;9 的String使用byte,接口的私有方法
1.2 容器
基本都是源码级别
理解的要求,自己实现需要注意什么,各个培训机构和八股文其实讲烂了,多看几遍就记住了
List
- ArrayList
- LinkedList
- 数组和List之间的相互转换,注意事项
Map
- HashMap:底层结构,put流程(死循环原因),扩容流程(前面都是7和8对比说),几个参数(容量2的幂,refactor 0.75,8,6,64)默认值原因,线程安全(null的时候)
- Collections.synchronizeMap(),HashTable(问题,锁粒度大)
- ConcurrentHashMap:7分段锁原理,锁粒度;8的CAS+ synchronized以及所粒度;转移节点,协助扩容。count 的CAS并发计算,
- TreeMap
Set
- HashSet
- TreeSet
Queue
- BlockingQueue
2、并发编程
线程池基本是问的,再写个并发编程的代码
-
Thread:4个创建方式、中断、状态以及状态变化涉及的方法
-
线程池:Excutors的缺点,参数含义,阻塞队列的选择,参数的选择,常见拒绝策略
-
ThreadLocal:实现源码,内存泄漏,子线程想共享怎么办
-
volatile:作用,实现原理,MESI,为什么有了MESI还要volatile(MESI 实现可见性–>store buffer + 失效队列 实现加速,但是带来不一致–>读写屏障解决不一致–>volatile手动设置屏障位置)。
-
synchronized:使用(方法和代码块使用的锁,阻塞,条件等待),字节码(方法和代码块的区别),JVM实现原理ObjectMonitor(数据结构,加锁流程),锁的升级流程
-
Lock
- AQS:继承需要实现方法,如何实现可重入(state字段),如何实现公平和非公平,同步队列和条件队列(Condition)
- 常见Lock的实现
- 和synchronized的对比:使用上,实现原理上,效率上,使用场景选择
-
JMM:逻辑还是物理存在,导致的问题。
-
Serial:单线程下,即使CPU指令重排,看起来没有重排
-
happens-before:多线程下,即使不是按照顺序执行,看起来是顺序执行
3、JVM
也是基本会问的,最好看看课或者书,看课收益高见效快,B站多的是
类加载
- 加载链接(验证准备解析)初始化,初始化时机,准备阶段做什么,类卸载的条件。
- 双亲委派源码,常见类加载器,自定义类加载的方式
- Tomcat如何打破,如何实现热加载
对象实例化
- 加载,分配内存,设置对象头,执行init方法
- 对象头的构成
JVM内存模型
- 共享(堆,方法区),独享(虚拟机栈,本地方法栈,程序计数器)
- JDK678中方法区的实现改进
- 字符串常量池在6和7 的区别,intern() 的实现机制差别
GC理论
- 为什么需要GC,为什么其他语言不需要GC
- 垃圾定位:引用计数,可达性分析,GCroot是谁
- 区域划分
- 3个算法:使用区域,优缺点
- 垃圾回收器:特点,流程,使用场景,不同JDK默认的垃圾回收器,三色标记(增量更新,原始快照)
- 逃逸分析,标量替换
JVM参数调优
- 常见参数含义,Xms,Xmx,Xmn,Xss,SurvivorRatio
- 动态年龄判断机制
- 空间担保机制
4、设计模式
具体设计模式可以看这两篇博客:
👉👉Java设计模式
最简单的例子,在自己的项目里面使用策略模式替换了多种类型的时候 if else代码块,使得系统变得更加易扩展,也可以结合JDK源码里面和Spring源码里面涉及到的一些模式展开描述
- 单例模式(可能会手写,最好掌握,理解每一个字段的作用)
- 饿汉
- 懒汉:
- 双重检查 + volatile + synchronized
- 静态内部类:可以防止反射攻击
- 枚举类
- 工厂模式
- 策略模式
- 适配器模式
- FutureTask
- 责任链模式
- 模板方法
- 监听者模式
5、MySQL
这个要理解好还真得看看书,视频和专栏都太简略了,我基本比较好评的书、视频、专栏都看了
- SQL题目(基本刷题,看书没用):连表查询,分组查询,SQL关键字的执行顺序
- 存储引擎
- innodb和MyISAM的区别
- 索引
- 实现数据结构,为什么用这个
- 优化理论
- 联合索引??
- 事务
- 事务特性,AID实现C,如何实现
- 隔离级别,如何实现
- MVCC = readview + undolog
- 日志
- binlog:意义,参数设置
- redolog:2阶段提交,redolog buffer/block
- undolog:记录的内容
- 三者区别
- 高可用
- 主从复制:三个线程执行流程。
- InnoDB实现原理
- 慢查询
- 定位
- show processlist
- 设置慢查询日志超时时间
- 解决
- 偶尔:buffer pool小,redolog buffer小,
- 频繁:explain 看是否有索引,是否用对索引。
- 定位
- SQL完整流程
- BufferPool
6、Redis
最常见的就是数据结构的实现,使用场景以及持久化的一些原理,缓存问题
- Redis 和 memcache 的对比
- 数据结构:常见五个记住就好,以及一些简单的命令
- 各自的实现编码的方式
- sds的改进,和c、java对比,
- 跳表的实现,
- 字典和跳表为什么结合使用,zset分别使用key以及分数查询时候的时间复杂度,实现原理
- 为什么不使用红黑树或者B+树而使用跳表
- 应用场景
- 持久化
- aof
- rdb
- 混合持久化
- 事务
- 自带的
- lua脚本
- 缓存问题以及常见解决方案
- 缓存雪崩
- 缓存击穿
- 缓存穿透
- 数据库和缓存不一致方案
- 主从复制
- 全量复制原理
- 增量复制原理
- 哨兵
- 如何实现自动切换
- raft 选哨兵的主
- 客户端使用时候的注意事项
- 集群
- 实现原理
- gossip 原理
- 分布式锁
- 数据库
- Redis
- nx
- lua
- zk
6、spring
培训机构最喜欢讲的,比较偏向社招,不要太沉迷,说的就是我
-
IOC 和 依赖注入的源码实现
-
AOP的源码实现
-
spring 的启动流程
-
循环依赖的解决(二层缓存可以吗,一层呢)
-
事务的实现原理
-
事务的传播机制,隔离级别
-
Bean的生命周期,线程是否安全
-
spring的扩展点
-
springboot (下面的三个就基本够了)
- 自动配置的原理
- 启动的原理
- starter的原理
7、rabbitMQ
- rabbitMQ 和 rocketMQ 和 kafka的对比,使用场景
- 常见问题:消息不丢,消息有序,消息不重,消息积压的解决方案
- 实现原理(时间不够挑一个重点学,我学的rocket,因为用java实现的)
8、计算机网络
“小林coding”的电子书,应对普通研发岗绰绰有余
- 四层七层模型分别作用
- 应用层:http请求响应组成,常见字段,状态码,http 1、1.1、2、3的区别,https流程,
- 传输层:TCP和UDP区别,TCP握手回收流程,状态变化,每一次消息丢失的补救措施,头部字段。UDP如何实现安全
- 网络层:IP层
- 数据链路层
- URL回车整个流程
- 网络安全:中间人攻击,CSRF跨站请求伪造,XSS跨站脚本攻击,SYN Flood攻击 ,DNS劫持,对应的解决办法
9、操作系统
CPU缓存行,执行一个c程序的流程,虚拟内存,分页分段段页式,进程线程协程,PCB组成,进程间通信,线程间通信
Linux:
- 常见命令使用:top,iostat,lsof,ping,
- 命令原理,kill原理,fork()函数原理
- 僵尸进程,孤儿进程
- 索引目录项,索引节点inode,数据块
- 硬链接(ln -s , 同一个INODE,多个指向自己),软链接(不同INODE,文件里面放的文件指针)
五、非重点
Netty(花费了我大量时间,结果没人问,装逼失败,所以大家还是多关注面经里面问的比较主流的东西吧)
- reactor + 多路复用
- 零拷贝的几个实现方式,netty的具体实现
- 源码流程
- netty 如何解决粘包拆包,断线重连,JDK的空轮询
- ByteBuffer和ByteBuf的区别是什么
SpringMVC
- 运行流程是什么
- RequestMapping的原理是什么
Mybatis
- 两个缓存的作用是什么
#
和$
的区别- 设计模式
微服务
- 为什么使用微服务,又是优点和缺点
- 服务如何拆分
docker (字节做go的部门可能会问问)
- 解释namespace
- 解释cgroup
Git (没问过我)
maven (没问过我)
更多后端全部八股点击👉👉【闲鱼】https://m.tb.cn/h.5yHpgkY?tk=O8bhWpn1NBD CZ8908 「我在闲鱼发布了【京985计算机硕士自用后端八股文出售,不同于市面上的几块钱八】」
点击链接直接打开
Java后端各科最全八股自用整理,获取方式见
:
整理不易🚀🚀,关注和收藏后拿走📌📌欢迎留言🧐👋📣
欢迎专注我的公众号AdaCoding 和 Github:AdaCoding123