大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
Java 进阶概览
这一课你将能做到
- 说清 java-fundamentals 与本 track 的分工,并把自己的薄弱点对应到后面 11 课中的某一课
- 确认本机 JDK 21+ 环境,用一条命令跑通一个综合了 enum、record、switch 表达式、Stream 的示例程序
- 用「语言特性 → 工程能力 → 框架视野」三层结构给任意 Java 知识点定位,规划学完后的去向
为什么要学
学完 Java 语言基础,你已经会写类、用 List/Map、能跑 Maven 测试。但打开真实企业的 Spring Boot 项目,会立刻遇到一批基础课没讲透的东西:订单状态为什么用 enum 而不是字符串、接口返回为什么全是 record、线程池参数怎么定、为什么没有人手动 new Service()。
人话:基础课教会你「把话说完整」,本 track 教你「把话说得像企业代码」。同时,集合、并发、OOP 是 Java 面试的三大高频区,答案要练到能脱口而出。
本站实战栈是 Spring Boot + MySQL + Redis + Nginx,本 track 的例子尽量贴这个栈:枚举做订单状态、record 做 DTO、线程池模拟下游调用、DI 对应 Spring 的 @Autowired。学完直接衔接 Spring Boot 实战。
先建立图像
本 track 12 课分三层,自下而上:
┌─────────────── 框架视野 ───────────────┐
│ jva-web jva-quarkus │ ← 知道生态怎么选
├─────────────── 工程能力 ───────────────┤
│ jva-concurrency jva-di │ ← Web 服务的运行底座
├─────────────── 语言特性 ───────────────┤
│ jva-enums jva-collections jva-oop │
│ jva-methods jva-records jva-modules │ ← 企业代码的日常用语
└────────────────────────────────────────┘
jva-intro(本课)→ jva-practice(综合练习)
| 主题 | java-fundamentals | java-advanced-essentials(本课) |
|---|---|---|
| 语法、基本 OOP | ✅ 14 课 | 复习 + 深化 |
| List / Map 入门 | ✅ | Set、Queue、Deque 选型 |
| 枚举、Record、模块 | 不展开 | ✅ |
| 并发、DI、Quarkus | 不展开 | ✅ |
| Maven、IO、异常 | ✅ | 不重复 |
跟着做
步骤 1:确认环境
终端执行两条命令,确认 JDK 版本 ≥ 21:
java -version
mvn -version
java -version 输出形如 openjdk version "21.0.x"。Maven 暂时没装也不影响,本 track 示例都支持单文件运行,到 jva-practice 再补装 Maven 即可。
步骤 2:写一个「特性巡礼」程序
新建 FeatureTour.java,一次用到后面几课的主角——enum、record、switch 表达式、Stream:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class FeatureTour {
enum OrderStatus { WAIT_PAY, PAID, SHIPPED }
record Order(long id, String sku, int amount, OrderStatus status) {
Order {
if (amount <= 0) throw new IllegalArgumentException("amount 必须为正数");
}
boolean paid() {
return status == OrderStatus.PAID || status == OrderStatus.SHIPPED;
}
}
static String label(OrderStatus status) {
return switch (status) {
case WAIT_PAY -> "待支付";
case PAID -> "已支付";
case SHIPPED -> "已发货";
};
}
public static void main(String[] args) {
List<Order> orders = List.of(
new Order(1, "SKU-1001", 2, OrderStatus.PAID),
new Order(2, "SKU-1002", 1, OrderStatus.WAIT_PAY),
new Order(3, "SKU-1001", 3, OrderStatus.SHIPPED));
Map<String, Integer> sold = orders.stream()
.filter(Order::paid)
.collect(Collectors.groupingBy(Order::sku,
Collectors.summingInt(Order::amount)));
System.out.println("各 SKU 已售数量:" + sold);
orders.forEach(o -> System.out.println(o.id() + " -> " + label(o.status())));
}
}
步骤 3:单文件直接运行
JDK 11+ 支持不写 javac,保存后直接:
java FeatureTour.java
预期输出:
各 SKU 已售数量:{SKU-1001=5}
1 -> 已支付
2 -> 待支付
3 -> 已发货
逐行核对输出与代码:Order 是 record(只声明组件就自动有构造器与访问器),label 是 switch 表达式(漏一个 case 编译不过),sold 是 Stream 管道(filter + 分组求和)。
步骤 4:给知识点定位
拿三个真实问题练习定位:订单状态该用什么类型?(语言特性 → 枚举)Tomcat 的工作线程和你的业务线程池什么关系?(工程能力 → 并发)为什么 Spring 项目里没人手写 new UserService()?(框架视野 → DI)定位不清的知识点,说明该学的课还没到。
讲清楚要点
- 基础课与进阶课互补不重复:基础课打地基(语法、异常、IO、Maven),进阶课补企业代码高频但基础课装不下的部分——集合选型、现代语法、并发、DI、框架地图。
- JDK 用 21(LTS):record、switch 表达式已转正,虚拟线程也已正式发布;面试说「熟悉 JDK 17/21 新特性」是明确加分项。本 track 代码兼容 JDK 17 与 21。
- 单文件源码启动:
java X.java一条命令先编译后运行,适合教学示例;企业项目仍走 Maven 多文件结构与mvn package。 - 三层定位法:语言特性决定「写什么代码」,工程能力决定「服务怎么跑稳」,框架视野决定「技术怎么选」。任何新知识点都能放进某一层,放不进去的通常是碎片信息。
- 面向 Spring Boot 铺路:本 track 的封装、DI、线程池概念,在 sb-ioc 等课会以注解形式再次出现,届时是「认亲戚」而不是「从头学」。
你可能会懵的地方
-
学过 java-fundamentals,为什么还要上这门课? 基础课目标是「能写对」,本 track 目标是「写得像企业代码、答得出面试」。枚举选型、Set/Queue、并发、DI 在基础课里只占半页纸,这里每课展开成一个主题,并直接对接 Spring Boot 语境。
-
JDK 21 和 17 差很多吗?企业都在用哪个? 两者都是 LTS。存量项目 17 最多;21 新增虚拟线程正式版、record 模式等,新项目多直接上 21。本 track 代码两个版本都能编译运行。
-
java X.java和先javac再java有什么区别? 单文件启动在内存里完成编译,不生成.class文件,且只支持单文件。多文件项目必须交给javac/Maven 编译后再运行,本 track 只有 jva-practice 用到 Maven。 -
要把所有 API 背下来吗? 不需要。要背的是面试高频的「原理与选型」:集合复杂度、线程池七参数、equals/hashCode 契约。API 用法靠 IDE 补全与官方文档,现场查即可。
-
本 track 和算法课冲突吗? 不冲突。dsa-java 刷题,本课补工程向 Java,两者共用集合知识,并行推进效率最高。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 语法没稳就直冲并发课 | 每个字都认识,连起来读不懂 | 先按顺序过完前六课语言特性 |
| 用 JDK 8 跑本 track 示例 | record、switch 表达式编译不过 | 安装 JDK 21(LTS) |
| 示例复制粘贴跑通就过 | 下课即忘 | 关掉示例,凭理解重写一遍 main |
| 只收藏教程不动手 | 「看会了」是错觉 | 每课至少跑通一段可运行代码 |
| 把 enum/record 当「语法糖」跳过 | Spring Boot 新代码大量使用 | 当作现代 Java 的日常用语认真学 |
卡点急救
java不是内部或外部命令:JDK 未安装或 PATH 未配置。安装 JDK 21 后把%JAVA_HOME%\bin加入 PATH,重开终端再验证。- 源码含中文编译报错或输出乱码:Windows 控制台默认 GBK。运行时加
-Dfile.encoding=UTF-8,文件保存时明确选 UTF-8 编码。 mvn命令不存在:Maven 未安装或未配 PATH。前几课不依赖 Maven,可先跳过,jva-practice 再补。
面试常问
-
JDK 8 → 17 → 21 必须知道哪些新特性? 可背版:8——Lambda 与 Stream API;11——HTTP Client、单文件源码运行;17——sealed 密封类、switch 表达式收编进 LTS;21——虚拟线程正式发布、record 模式与 switch 模式匹配转正。答题套路是「按版本报特性 + 一句话用途」。
-
record、enum、switch 表达式分别解决什么问题? record 消灭数据载体的样板代码(构造器/equals/hashCode/toString 一行生成);enum 把魔法字符串升级为编译期可检查的有限类型;switch 表达式消灭 fall-through,且对枚举强制穷尽所有分支。
-
你会怎么规划 Java 后端学习路线? 语言基础 → 集合/并发/OOP 进阶(本 track)→ Spring Boot + MySQL/Redis 实战 → 微服务与中间件 → 按需补 JVM 与源码。体现「先主线后支线、以项目为锚点」的工程判断即可。
自测三问
- 本 track 12 课分哪三层?jva-concurrency 属于哪一层、为什么?
java FeatureTour.java没有先执行javac,为什么能跑?限制是什么?- 订单状态用
String还是 enum?给出两条站得住的理由。
小结一句话
基础课写对代码,进阶课写出企业代码:先语言特性、再工程能力、后框架视野,终点是 Spring Boot 实战。