CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Java 进阶/课时/Java 进阶概览
RawBlame
课时目录12 节

Java 进阶

  1. 01Java 进阶概览
  2. 02枚举与模式
  3. 03Set/Queue/Stack
  4. 04OOP 进阶
  5. 05方法链与绑定
  6. 06Record 与不可变
  7. 07模块系统
  8. 08并发进阶
  9. 09依赖注入概念
  10. 10Java Web 框架
  11. 11Quarkus 入门
  12. 12综合练习

Java 进阶概览

与 java-fundamentals 分工;java 路线图定位。

25 分钟

Java 进阶概览

这一课你将能做到

  1. 说清 java-fundamentals 与本 track 的分工,并把自己的薄弱点对应到后面 11 课中的某一课
  2. 确认本机 JDK 21+ 环境,用一条命令跑通一个综合了 enum、record、switch 表达式、Stream 的示例程序
  3. 用「语言特性 → 工程能力 → 框架视野」三层结构给任意 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-fundamentalsjava-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)定位不清的知识点,说明该学的课还没到。

讲清楚要点

  1. 基础课与进阶课互补不重复:基础课打地基(语法、异常、IO、Maven),进阶课补企业代码高频但基础课装不下的部分——集合选型、现代语法、并发、DI、框架地图。
  2. JDK 用 21(LTS):record、switch 表达式已转正,虚拟线程也已正式发布;面试说「熟悉 JDK 17/21 新特性」是明确加分项。本 track 代码兼容 JDK 17 与 21。
  3. 单文件源码启动:java X.java 一条命令先编译后运行,适合教学示例;企业项目仍走 Maven 多文件结构与 mvn package。
  4. 三层定位法:语言特性决定「写什么代码」,工程能力决定「服务怎么跑稳」,框架视野决定「技术怎么选」。任何新知识点都能放进某一层,放不进去的通常是碎片信息。
  5. 面向 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 的日常用语认真学

卡点急救

  1. java 不是内部或外部命令:JDK 未安装或 PATH 未配置。安装 JDK 21 后把 %JAVA_HOME%\bin 加入 PATH,重开终端再验证。
  2. 源码含中文编译报错或输出乱码:Windows 控制台默认 GBK。运行时加 -Dfile.encoding=UTF-8,文件保存时明确选 UTF-8 编码。
  3. 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 与源码。体现「先主线后支线、以项目为锚点」的工程判断即可。

自测三问

  1. 本 track 12 课分哪三层?jva-concurrency 属于哪一层、为什么?
  2. java FeatureTour.java 没有先执行 javac,为什么能跑?限制是什么?
  3. 订单状态用 String 还是 enum?给出两条站得住的理由。

小结一句话

基础课写对代码,进阶课写出企业代码:先语言特性、再工程能力、后框架视野,终点是 Spring Boot 实战。

延伸

  • Oracle JDK 21 官方文档
  • dev.java 官方学习门户
  • 下一课:枚举与模式
加载本节练习…
下一课 →枚举与模式