Java 面试路线:把知识点练成能解释的答案
2026/11/6大约 7 分钟学习路线Java 面试后端工程
适合学过 Java、写过简单后端接口,准备求职或跳槽的同学。先选一个自己能运行的项目,围绕同一条请求链复习。每步可以安排一周,每周约 8—10 小时;已经掌握的内容用现有代码和记录核对后跳过,没有完成的步骤可以延长。
如果还不能独立写接口或执行 SQL,先看成长阶段说明。这条路线整理已有基础,不承担从零学习全部后端知识的任务。
第一步:找一个答不清的点,把集合题写成代码
- 阅读: 先在自测工作台独立答一组 Java 题,再读HashMap 底层原理;参考面试复盘样例记录自己漏掉的条件。
- 任务: 用半小时画出一条接口的调用链,标出集合、事务、SQL 和外部调用。选一个真实缺口做小程序:例如用自定义 Key 验证两个相等对象能否取出同一个值,再修改已入表 Key 中参与哈希计算的字段,观察查找行为。先写预测再运行。
- 产物: 一段独立可运行的代码、JDK 版本、原回答、预期与实际输出,以及修订后的两分钟解释。
- 检查点: 能说明
equals、hashCode与键是否变化分别影响什么;能沿自己使用的 JDK 源码定位依据。讨论树化时能说明容量和操作路径,不只背常量。 - 卡住怎么办: 暂停业务项目,只保留一个类、一个 Map 和两个 Key。打印哈希值与相等比较结果;看不懂源码先补Java 基础和集合框架,一次解决一个条件。
第二步:跟着一次线程池饱和往下问
- 阅读: 线程池面试专题、线程池过载指南,不熟悉线程协作时补多线程与并发编程。
- 任务: 按指南的门闩示例,配置核心线程 2、最大线程 4、有界队列 2 和
AbortPolicy。在门闩未释放时连续提交 7 个任务,先推导哪些任务创建线程、哪些排队、何时拒绝,再运行;结束时释放门闩并关闭线程池。 - 产物: 参数表、提交时序、自己的运行输出和拒绝分支处理说明。文章给出的输出只供对照,不替代本次执行。
- 检查点: 能解释“核心数满后先入队,队列接纳失败后再尝试扩容”;区分规则推导、实际观察与任务开始顺序。能回答入口收到拒绝时如何返回,为什么不能仍报成功。
- 卡住怎么办: 先原样运行最小示例,检查门闩是否提前释放、队列是否真有容量上限、是否使用同一拒绝策略。没有打印任务开始时间,就不推断全部执行顺序;不要用增加
sleep掩盖时序问题。
第三步:确认事务到底在哪一层生效
- 阅读: 事务面试专题、Spring 事务提交边界,结合自己项目的 Spring 版本与事务配置阅读。
- 任务: 在练习数据库中准备一个有两次写入的 Service 方法,通过另一个 Bean 调用它。在第二次写入前抛出未捕获的运行时异常,从新请求或独立连接核对两次写入的结果;再在练习副本比较同类内部调用未经过代理的路径。每次恢复相同初始数据。
- 产物: Controller、Service、代理与数据库的调用图,事务配置,异常抛出位置,以及正常、异常两条路径的数据记录。
- 检查点: 能解释入口是否经过事务代理、异常是否传播、是否加入外层事务;知道方法体执行完与物理事务提交不同。涉及缓存或通知时,能指出数据库回滚无法撤销哪些外部动作。
- 卡住怎么办: 先缩到同一数据源、两个 Bean 和一个本地事务。检查异常是否被捕获、方法是否由 Spring 管理、测试外层是否另有事务;不要同时引入异步线程或多数据源。指南中的设计片段需要自己实现和验证。
第四步:把 SQL 和缓存放回同一条读写链
- 阅读: MySQL、缓存失效与旧值回填。
- 任务: 在本地 MySQL 固定一份数据、一个列表查询和排序条件,保存原 SQL 的普通
EXPLAIN,再比较一个候选索引的计划。接着画出“读未命中并取得旧值 → 写提交并删除缓存 → 读回填旧值”的交错时序;项目已有 Redis 时再实际回放,否则将该部分标为时序推导。 - 产物: 数据库版本、表结构、SQL、索引、数据分布与前后计划;一张缓存竞态图,注明已执行与未执行的部分。
- 检查点: 能说明索引服务了哪些过滤或排序条件,计划变化能证明什么;能区分删除失败、结果未知与删除成功后的旧值回填。没有重复测量就不写接口提速比例。
- 卡住怎么办: 去掉联表,只保留一个查询和一个索引;先确认实际使用的是 MySQL,不能把 H2 的结果写成 MySQL 实验。缓存先推演两个请求的先后关系,再决定是否需要实现补偿任务。
第五步:用日志和线程状态定位一次慢请求
- 阅读: JVM、场景题和线程池指南中的排障顺序。
- 任务: 在自己的本地练习接口中制造可控等待,例如等待门闩的下游桩;为同一请求关联入口、排队、执行与数据库耗时。核对当前 JDK 支持的诊断命令后采集线程状态,解除等待,再用同一输入复跑。
- 产物: 一份“现象 → 证据 → 假设 → 验证”的记录,附请求关联标识、时间线和相关线程栈,保留未证实的假设。
- 检查点: 能用等待位置解释本次慢请求,并说明解除等待后发生什么;不凭一次慢响应断言 CPU、GC 或数据库一定有问题。本地人为故障只说明这一条分支。
- 卡住怎么办: 先固定一个请求、一个等待点,确认日志能关联。拿不到诊断权限时保留应用时间线,注明缺少线程证据;指标不足就继续采集,不急于调线程数或堆大小。
第六步:用自己的材料做两轮模拟问答
- 阅读: 面试专题入口、面试复盘样例、项目故事与证据。
- 任务: 选前面两项亲自完成的实验或项目改动,录一分钟介绍与三分钟链路讲解。第一轮回答“为什么、怎么做、怎么验证”;第二轮继续问“失败怎么办、换一个条件还成立吗、本人改了什么”。独自练习也可以先写问题,隔一天再回答。
- 产物: 两轮录音或逐字提纲、五个追问、修订清单,以及下一次补做的一个实验。
- 检查点: 每个结论能定位到代码或记录,能主动说明 JDK、框架、数据与运行条件。答不清的地方能说出待验证项,而不是借用别人的项目结果。
- 卡住怎么办: 先对照一段代码讲清输入和输出,再补原理。把“并发不熟”改成“还不能解释队列满后的拒绝分支”这样的小问题,回到对应步骤补一份证据。
做到什么程度可以先告一段落?
至少保留一个集合实验、一个线程池实验、一份事务数据记录、一份 SQL 或缓存分析、一份慢请求排查,以及两轮问答复盘。记录里清楚区分实际运行、规则推导和待验证项,就能看出下一轮该补哪里;这些材料不代表全部面试题已经掌握。
把个人改动带入项目到简历路线,准备 AI 应用实践时进入Java 转 AI 路线。资料可从Java 面试资料查找,起点判断见成长阶段说明。
