Java 后端学习路线
一句话结论(30s)
Java 后端学习要”源码级理解 + 量级思维”两条腿走路——因为只背结论无法应对面试追问(HashMap 为什么容量是 2 的幂、树化阈值为什么是 8),只有每学一个中间件回答”解决了什么问题、有什么代价、原理是什么”,并能讲清 100 到 100 万用户的瓶颈与方案,才算真正掌握。
核心原理(2min)
- 三阶段路线:语言基础(2-3 月,含 JVM 初级与并发基础) → 框架与中间件(3-4 月,Spring/MySQL/Redis/MQ/OS/网络) → 系统设计与项目实战(2-3 月,秒杀/读写分离/缓存/高并发 IO)。
- 中间件三问:解决了什么问题、有什么代价、原理是什么(如 Redisson 分布式锁)。
- 量级思维:100 用户→单体;1000→索引+连接池;1 万→缓存+读写分离;10 万→分库分表+MQ 削峰;100 万→多维拆分+多级缓存+熔断降级。
- 心得:问”为什么这么设计”、写博客输出、项目实践、深挖一个领域到源码级。
底层深入(5-10min)
阶段一:语言基础(2-3 个月)
- Java 基础:面向对象、集合类(HashMap/ArrayList 源码级)、泛型、异常、注解、反射
- JVM 初级:运行时数据区、垃圾回收基础(Minor GC / Full GC)、常用 JVM 参数
- 并发基础:synchronized/volatile、线程池、ThreadLocal、基础 CAS
学习方法
不要止于”会用”——看源码。HashMap 为什么容量是 2 的幂?为什么扰动函数是 h ^ (h >>> 16)?这些问题你回答得了,说明你读懂了源码,不只是背了结论。
思考穿插:为什么”会用 HashMap”和”读懂 HashMap 为什么容量是 2 的幂”是两个层次?因为”会用”只解决眼前的需求,“为什么这么设计”才决定你在面试和排查里走多远——容量取 2 的幂,才能用
(n-1) & hash代替取模、让高低位都参与散列,追到这一层,你才算理解了设计者的权衡,而不是背了个结论。
阶段二:框架与中间件(3-4 个月)
- Spring 全家桶:IoC/AOP 原理、事务传播、Spring Boot 自动装配
- MySQL:索引(B+ 树结构、最左前缀)、事务与 MVCC、锁机制、SQL 优化
- Redis:五种数据结构 + 编码、持久化 RDB/AOF、哨兵/Cluster、缓存三问题
- 消息队列:RocketMQ 架构、延时消息、事务消息
- 操作系统:虚拟内存、进程线程、epoll、零拷贝
- 计算机网络:TCP 三次握手/四次挥手、HTTPS、HTTP/2
学习方法
每学一个中间件,回答自己的三个问题:解决了什么问题、有什么代价、原理是什么。 比如 Redisson 分布式锁——解决了 SET NX EX 的锁超时/误删/不可重入三个坑,代价是引入了 Redis 依赖(如果 Redis 宕机则所有服务等锁不可用),原理是 Lua 脚本原子执行 + Hash 数据结构可重入计数。
思考穿插:为什么中间件三问里”代价”这一问不能省?因为任何技术都是权衡,没有免费午餐——Redisson 解决三个坑的同时,把可用性押在了 Redis 上。面试官问”有什么代价”时,其实在筛掉那些只会背优点、不懂边界的候选人;能说出代价,才证明你的理解是完整的。
阶段三:系统设计与项目实战(2-3 个月)
- 秒杀系统:分布式锁 → 分段锁 → Redis 原子库存 + 异步写 MySQL
- 读写分离:一主多从 + ShardingSphere 路由 + MHA 故障切换
- 缓存优化:布隆过滤器防穿透、互斥锁防击穿、TTL 随机化防雪崩
- 高并发 IO:虚拟线程 vs WebFlux、epoll + Reactor 模式
学习方法
不以”会做”为止——要能从 M (10 用户)到 10M 用户每个量级的瓶颈和方案都能讲清楚:100 用户 → 单体足够;1000 → 数据库索引 + 连接池优化;1 万 → 缓存 + 读写分离;10 万 → 分库分表 + 消息队列削峰;100 万 → 多维拆分 + 多级缓存 + 熔断降级。
思考穿插:为什么要练”量级思维”,把 100 到 100 万用户每个档的瓶颈都讲清楚?因为系统设计的核心是”规模变了,瓶颈就变”——100 用户加索引是过度设计,100 万用户不加缓存就是事故。能按量级给方案,说明你不是只会背某个技术名词,而是理解每个方案对应的规模边界。
工具链
- 版本控制:Git(commit/push/pull、merge/rebase、cherry-pick、reflog)
- 构建工具:Maven(依赖管理、插件、profile)
- 容器化:Docker(Dockerfile、docker-compose)、K8s 基础概念
- 线上排查:jstack / jmap / Arthas / Prometheus + Grafana
- CI/CD:Jenkins / GitHub Actions 流水线基础
学习心得
- 不要背八股——问”为什么这么设计”。HashMap 为什么树化阈值是 8?因为泊松分布中链表长度达到 8 的概率约为 6×10⁻⁸——这是”正常情况不会发生”的信号。
- 写博客:把学到的东西用自己的话讲一遍——输出是最好的学习
- 项目中应用:学了虚拟线程别只记 Pinning 的定义——在项目中启用 JFR 抓一下 Pinning 事件,看到实际的栈,理解才算完整
- 深挖一个领域:至少在并发(JUC)、MySQL(索引+事务+日志)或 Redis(数据结构+持久化+高可用)中选一个方向精读到源码级
章末提问
这条路线里的每个”为什么”,都是最值得追问的点。以下是三个典型追问:
-
“HashMap 的容量为什么是 2 的幂?” 结论先行:「因为这样可以用
(n-1) & hash代替取模运算,且扰动后高低位都参与散列,分布更均匀。」因为 对方在验证你是”读懂源码”还是”背结论”——能讲出”取 2 的幂是为了位运算 + 均匀散列”这套因果,才证明你真的追过设计动机。 -
“学中间件时为什么要问’代价是什么’?” 结论先行:「因为没有免费午餐——任何技术都用新代价换新收益,比如 Redisson 分布式锁解决了锁超时/误删/不可重入,却把可用性押在 Redis 上。」因为 对方要筛掉只会背优点的候选人,能说出代价说明你理解技术边界,做选型时才不会盲目。
-
“从 1 万用户到 10 万用户,你会加什么方案?为什么?” 结论先行:「分库分表 + 消息队列削峰——因为单库写入和瞬时流量成为新瓶颈,读写分离只解决了读、解决不了写。」因为 这题在考量级思维——你要能说出”上一级方案为什么不够用、这一级补的是什么短板”,而不是把所有技术名词一股脑堆上来。