简介:面向Java后端开发与求职的313页合集,以单个PDF文件打包(约18.8MB),为初中级开发者提供了一条完整的学习与面试准备路径。内容按学习路线展开,先讲基础语法、环境搭建、面向对象与计算机网络、操作系统等计算机基础,再进入集合框架、并发编程、同步机制、线程池、异常处理、IO与NIO、网络编程等Java进阶知识。随后延伸到数据库操作、Spring Boot/Spring MVC、持久层框架、Web开发与常用设计模式,并穿插大量面试八股文,涵盖垃圾回收、JVM内存模型、多线程问题、数据结构与算法、网络协议等高频考点,还有阿里巴巴等大厂真实面经。末尾整理了程序员简历制作模板与案例,便于结合个人项目经历打造有竞争力的简历,实现从知识复习到面试实战的全流程覆盖。目前已有1549人学习下载,适合需要完整总结Java后端知识体系、短期内冲刺秋招或社招的开发者。 很多人的网盘里都躺着一份“313页最全合集”,收藏之后就像已经复习完了。但真正的后端面试准备根本不是阅读问题,而是知识树的搭建问题。标题里那些部分——学习路线、基础知识、计算机基础、八股文、大厂面经、简历制作,对应的不是六类资料,而是六个需要交叉验证的环节。尤其对已经有工作经验的人来说,时间和记忆都有限,更不能按PDF顺序从头啃到尾。我们把骨架先画出来,再讨论每一层需要塞什么,以及最容易耗尽人耐心的几个坑。
2. Java基础知识:从语法到JVM的分层打法
后端开发的知识体系里,Java基础是最容易被“我好像会了”带偏的一块。写业务代码时天天用,但面试官一问原理就卡壳。原因在于Java基础考核是分层的:能写对是一层,知道底层原理是另一层,能根据场景调整方案才是真正拉开差距的层。我通常把复习重点拆成语法/集合、并发/JVM两个方向,因为大厂面试中的Java后端题目,九成从这里出。
2.1 语法与集合:别在简单问题上丢分
先说一个几乎人人都会踩的坑:在增强for循环里删除集合元素。
List<String> list = new ArrayList<>(List.of("a", "b", "c")); for (String s : list) { if ("b".equals(s)) { list.remove(s); } }这段代码在遍历到“b”时调用list.remove,最终抛出ConcurrentModificationException。原因是ArrayList的迭代器在创建时记录了expectedModCount,每次访问下一个元素都会检查modCount是否被list.remove修改。两者一旦不一致,就触发fail-fast机制。业务代码里可以用Iterator或removeIf避开,但面试官想看到的,是你能说出迭代器内部的“预期修改次数”这个细节点。
集合部分的面试点非常固定,但很多五六年经验的工程师也只记得“HashMap是数组加链表”。我把高频考点整理成一张表,自己照着表逐项过一遍:
| 模块 | 必问点 | 面试官真正想听的 |
|---|---|---|
| HashMap | 哈希碰撞与树化 | 数组、链表、红黑树的转换条件,以及为什么树化阈值是8 |
| ConcurrentHashMap | 并发控制方法 | JDK7分段锁到JDK8 CAS+synchronized的变化,以及size()统计思路 |
| ArrayList/LinkedList | 数据结构差异 | 随机访问与插入删除的时间复杂度,以及内存局部性对实际性能的影响 |
| 异常的checked/unchecked | 编译期与运行期 | Spring声明式事务在抛出什么异常时会回滚,什么情况下不会 |
这样整理一次,后面准备八股文时就有了素材。别急着背阈值8,先去想泊松分布下节点数到8的概率,这个推导过程能让面试官觉得你是真的在看源码,而不是在背结论。
2.2 并发与JVM:决定Java工程师门槛的两个硬核
并发题目已经从“synchronized和lock的区别”升级到“你线上线程池参数怎么设置的”。我经常让候选人手写一个ThreadPoolExecutor的构造,因为参数是一环扣一环的。
ThreadPoolExecutor executor = new ThreadPoolExecutor( 2, // corePoolSize 核心线程数 4, // maximumPoolSize 最大线程数 60L, TimeUnit.SECONDS, // 空闲线程存活时间 new ArrayBlockingQueue<>(100), // 工作队列容量 new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略 );先看参数间的顺序:核心线程数2,最多同时执行两个任务;如果这两个线程都忙,新任务会进入ArrayBlockingQueue队列;队列容量100也满了,才会把线程数扩展到最大4;如果连4个线程都忙并且队列也满,就拒绝新任务。CallerRunsPolicy这个策略会让提交任务的线程自己去执行被拒绝的任务,这比直接抛异常更平滑,适合不希望丢弃消息的场景。实际参数怎么设,要分CPU密集还是IO密集,一般IO密集可以把核心线程数设为CPU核数两倍左右,最终还是要通过压测校正。
JVM部分不需要把所有参数都背下来,但启动命令里的三个必须能解释清楚:
java -Xms256m -Xmx1024m -XX:+UseG1GC -jar app.jar-Xms是堆初始大小,-Xmx是堆最大大小,-XX:+UseG1GC表示使用G1垃圾回收器。线上排查OOM问题时要先看堆设置,再看GC日志;没有这两个参数的感知,查一次Full GC会比较痛苦。面试中JVM问题有一条常见链路:内存区域划分 -> 对象什么时候可以被回收 -> 垃圾收集器对比 -> 参数调优。能在回答时主动串出这条链,说明你脑子里有整体模型,而不是零散记忆。
2.3 把知识变成自己的“可执行文件”
基础知识光看不够,我建议每个模块配一个最小实验。学HashMap就写一段死循环并发put的代码观察CPU飙升;学线程池就用一个循环提交1000个任务,再打印activeCount和queueSize;学JVM就用jstat观察GC次数。这不是为了炫技,而是让每个抽象概念都有一次实感。我自己复习时会把关键结论写进一个notes.md,一个知识点三行,一行结论,一行原理,一行场景。后面到了八股文阶段,这些笔记就是最值钱的原始材料。
3. 计算机基础:算法、操作系统与网络怎么补才有效
很多Java后端候选人只啃Java八股文,忽略计算机基础,结果在二面时被“TCP为什么是三次握手”问哑。计算机基础不是让你重新读一遍大学教材,而是选那些真正和“后端开发”强相关的部分:数据结构与算法解决业务建模能力,操作系统和网络解决线上问题排查能力。这两块越到后面越值钱。
3.1 数据结构与算法:刷题优先级和常见套路
后端的算法面试不像算法岗那样要求各种竞赛题,考的还是基础数据结构的应用。优先刷链表、数组、二叉树、动态规划和回溯,这五类覆盖了大多数公司的笔试题。链表题尤其重要,因为手写代码时能体现指针操作的基本功。比如反转链表这类题,看似简单,但很多五年经验的人猛然一写还是会卡在边界条件。
public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; }这段代码的关键是先用next变量保存当前节点的下一个节点,否则一旦修改curr.next,下一个节点就找不到了。面试中写完代码后,要能马上说出时间和空间复杂度,这里都是O(n)和O(1)。刷LeetCode不建议追求刷满3000题,把hot 100里的基础题做个三遍,每一遍都换一种思路,比如递归改迭代,或者空间换时间,效果比盲目刷题好得多。
3.2 操作系统与网络:把“背结论”变成“读命令”
操作系统和网络最怕背了一堆名词,却不知道它们映射到实际系统里的样子。比如“TCP三次握手”,如果你只背状态变化,很容易忘。但如果你亲手打开一个HTTP连接观察过,就不会忘。最简单的工具是用curl,它能打印出从建立连接到发送请求的完整过程。
curl -v https://example.com输出里以*开头的行是状态信息,比如* Connected to example.com (93.184.216.34) port 443表示TCP连接建立完成。紧接着* TLS 1.3 handshake completed表示SSL/TLS握手完成。之后以>开头的行是客户端发送的请求头,以<开头的行是服务器响应头。能完整解释这段输出的人,已经能把TCP、HTTP、DNS这几个知识串起来了。面试题“从地址栏输入URL到页面展示发生了什么”,本质上就是考这条链路。
3.3 一台虚拟机上做多层的“线上实验”
计算机基础部分还可以用一台Linux虚拟机做整体验证。启动一个Spring Boot应用后,用jstack看线程状态,用top -H -p看线程CPU消耗,用lsof -i :8080看端口监听,再把进程的线程栈dump下来分析。这一套做完,你对进程、线程、网络端口、堆栈这些基础概念会有一个立体认识。
jstack 12345 > thread_dump.txtjstack把线程栈输出到文件后,重点找“WAITING (parking)”“RUNNABLE”等状态。如果看到大量等待在锁对象上的线程,多半是并发资源竞争。以前后端面试问“CPU飙高怎么排查”,回答“top然后找进程,jstack看线程”就够了,现在还需要补充线程状态和锁信息。这部分不是纯八股文,而是一个工程师基本的求生技能。
4. 八股文:分类、整理与口语化转化
八股文这三个字很容易让人反感,但实际上它是“高频面试题的本地缓存”。别人把问题、原理、场景反复验证过,总结成一套标准答案,你直接拿来背诵,效率虽高却容易翻车。真正有效的八股文复习,是对着问题用自己的话讲一遍,讲到面试官能听懂为止。
4.1 什么是八股文,以及为什么大厂还问
后端领域的八股文,指的是集合原理、并发工具、JVM内存、Spring事务、MySQL索引、Redis缓存模型这类有固定答案的题目。它们之所以存在,是因为大厂要在短时间内筛选成千上万候选人,而计算机基础理论又必须掌握。你可以不认同这种机制,但不能不准备。实际工作里解决一次线上死锁,回头再看八股文里的Synchronized和ReentrantLock,会发现那些枯燥的答案确实有原型。
提示
背八股文的最终目的不是复述,而是在大脑里形成可索引的回答结构,等到面试现场能提取出来。
4.2 用“问题-原理-场景”模型整理知识卡片
把知识点做成知识卡片,比用目录式笔记更好用。一张卡片只聚焦一个问题,正面是问题,背面是回答。我在复习阶段常用这个模板:
### 问题:ConcurrentHashMap为什么并发度更高? - 一句话答案:JDK8中弃用了分段锁,采用CAS + synchronized锁单个桶。 - 关键原理:put时先根据hash找到桶,若桶为空则用CAS原子写入;若桶不为空,再对头节点加synchronized。 - 具体场景:秒杀场景里,多个线程同时放入购物车,需要对一个键多次累加。 - 延伸问题:与Hashtable、Collections.synchronizedMap的区别?读操作需要加锁吗?整理卡片时,一句话答案必须控制在20字以内,这样面试时能快速进入正题。后面的“具体场景”很重要,面试官听完原理很可能会追问“你在项目里哪里用到过”。如果没有真实场景,可以写一个典型的业务场景,但必须在简历项目中也对应上,否则容易被认为在背题。
4.3 高频八股题整理与作答示例
按照出现频率,以下八类题目占到了后端面试八股文的八到九成:
| 分类 | 高频问题举例 | 回答要点 |
|---|---|---|
| HashMap与ConcurrentHashMap | HashMap为什么线程不安全? | put覆盖、扩容死循环、modCount漂移 |
| 线程池 | 线程池参数怎么设置? | corePoolSize、队列、拒绝策略,结合场景 |
| JVM内存模型 | 哪些区域会OOM? | 堆、元空间、直接内存,及排查命令 |
| GC收集器 | G1和CMS选用哪个? | 停顿时间、整堆/分代回收的权衡 |
| 锁 | synchronized和ReentrantLock区别? | 自动释放、响应中断、公平锁 |
| Spring事务 | 事务失效原因有哪些? | 同类调用、异常被捕获、propagation设置错误 |
| MySQL索引 | 为什么会索引失效? | 非最左匹配、隐式类型转换、like前导通配符 |
| Redis | 缓存穿透、击穿、雪崩怎么解决? | 布隆过滤器、互斥锁、过期时间错峰 |
以“synchronized和ReentrantLock区别”为例,一个合格的回答结构是:先说都是可重入锁,再说ReentrantLock支持超时、可中断、公平锁,然后说它在竞争激烈时通过AQS实现,而synchronized经过偏向锁到重量级锁的升级。最后补一句“我平时用synchronized更多,因为简单;需要超时中断时用ReentrantLock”。这样既展示了原理,也体现了实践经验。
5. 大厂面经:从别人的经历中提取面试模型
面经是搜索热度非常高的词,但大多数人只是存了个链接,看个热闹。同样一份大厂面经,有人看完记住了“面试官问我Redis的key设计”,有人却反推出这个团队的技术栈、项目难点和面试偏好。问题在于,面经不是成功学故事,而是用来做信息差补全的原始数据。
5.1 面经的正确打开方式:不是看故事,是提取问题
我一般会把面经里提到的每个问题抄下来,先不思考答案,只做分类:Java基础、并发、JVM、Spring、MySQL、Redis、算法、系统设计、项目问题、HR题。然后统计每个分类出现的次数。如果一个面经里MySQL优化题目出现三次,说明这家公司很可能在大量使用MySQL,进一步推断业务偏存储密集型。再看它问的Redis是“缓存击穿”还是“分布式锁”,就能知道业务形态是读多写少还是并发写多。
整理时用一个简单的表格:
| 面经来源/岗位 | 技术栈关键词 | 高频问题 | 我没答上来的点 |
|---|---|---|---|
| 某大厂Java校招 | Redis、MQ、分布式 | 缓存一致性、消息丢失 | 我答不清“最终一致性”的实现细节 |
| 某中型公司社招 | Spring Cloud、K8s | 服务治理、容器化部署 | 对K8s的调度策略不熟 |
这个表格填完,复习方向会清楚很多。注意不要被单一面经带偏,至少看十份目标岗位的面经再统计,否则容易把个例当成普遍规律。
5.2 面试轮次与侧重点:技术面、主管面、HR面
大厂后端面试通常不止一面,每一面考察的东西不一样。技术一面喜欢问基础知识和算法,通过率高不高看你能不能在不提示的情况下写出完整代码。技术二面更偏项目深挖、系统设计和软技能,面试官会盯着你项目里的一个环节反复问,比如“这个消息队列为什么不用Kafka”“你如何保证库存不超卖”。主管面考察综合素质,问题更开放,比如“做过的项目里最难的是什么”。HR面则刷一些职业规划、离职原因、期望薪资,虽然不考技术,但回答思路决定offer级别。
给每一轮面经做标签时,要注意区分一面问题和二面问题,不要混在一起。很多市面上的面经没有标注轮次,使用时要自己推测,一般追问到“你们系统qps多少、怎么扩展”的,基本就是二面或主管面的难度。
5.3 复盘方法:将面经转成自己的题库
面经只有变成自己的题库才有价值。我的做法是把每个问题做成一个卡片,放到和八股文一样的卡片系统里,但额外标记“来自面经+问题背景”。比如“如果Redis缓存了用户信息,修改用户名时怎么保证缓存同步”,这道题既涉及缓存更新策略,又涉及DB和Redis事务。单纯背答案不够,我还会在电脑上写一个小demo,用一张表模拟数据,再手动走一遍Cache Aside Pattern。没有跑过真实代码的题目,面试时一旦被追问细节就露馅。
面经题库要持续维护,每次面试后立刻把被追问的问题加进去。总有一些问题是你以为准备过,但现场大脑空白的,这些点才是你和下一份offer之间的差距。
6. 程序员简历制作:让技能和项目变成可评估的证据
简历不是经历清单,而是推销说明书。招聘方看简历时只关心一件事:你能否胜任这个岗位。后端简历最常见的错位,是罗列“熟练掌握Java、Spring、MySQL、Redis”,但没有任何证据。解决办法是把一句技术名词变成一个问题、一个动作、一个结果。
6.1 技术栈写法的具体调整
技术栈不要只写“精通Redis”,可以写成“熟悉Redis核心数据结构,使用过缓存穿透布隆过滤器方案,和DB一致性通过延迟双删实现”。这样写,技术关键词还在,但每一条都对应了实际经验和决策过程。Java基础一栏同理,不要写“熟悉Java”,而是写“了解HashMap底层原理,能解释ConcurrentHashMap并发控制机制”。这些点都是你前面复习过的内容,自然可以写上去。
6.2 项目经历的STAR写法,附示例
项目描述要用STAR法则,但不是每一步都堆字数。推荐格式:业务背景 -> 你的动作 -> 量化结果。以秒杀项目为例:
美妆平台618促销期间,原接口在1000并发下出现库存超卖和响应变慢。我负责订单收敛模块,通过Redis预减库存和MQ削峰下单请求,将接口耗时从800ms降到150ms,压测结果下库存超卖率为0。
这段文字没有写“负责优化秒杀系统”,而是描述了问题、具体技术决策和量化结果。其中技术栈可以对应到八股文里的Redis、MQ、并发等题目,面试官只要顺着问,你就有话可说。
6.3 最后提交前的小技巧
简历文件命名为“姓名-岗位-工作年限”的格式,避免用“简历最终版v5”。如果岗位是Java后端,投递时可以把PDF同时附带一段项目代码的GitHub链接。不要贴几十个仓库,挑一个维护最多、注释最清晰的就好。面试官拿到简历后的第30秒,会快速扫技术和项目,这部分能抓住人,后面就进入你熟悉的八股文节奏了。
本文还有配套的精品资源,点击获取