Java 特性演进:从 Lambda 到虚拟线程
语言特性LANGUAGE
Java 的语言演进有一条清晰主线:让类型分支更安全、让数据载体更轻。从 var 到 record,再到模式匹配与 record 解构,都是在减少样板代码与强转。
| 语言特性 | JDK 8 | JDK 11 | JDK 17 | JDK 21 | JDK 25 | JDK 27 |
|---|---|---|---|---|---|---|
| Lambda / 方法引用 | 8 | 8 | 8 | 8 | 8 | 8 |
| var 局部变量推断(JEP 286) | — | 10 | 10 | 10 | 10 | 10 |
| switch 表达式(JEP 361) | — | — | 14 | 14 | 14 | 14 |
| 文本块(JEP 378) | — | — | 15 | 15 | 15 | 15 |
| record(JEP 395) | — | — | 16 | 16 | 16 | 16 |
| instanceof 模式(JEP 394) | — | — | 16 | 16 | 16 | 16 |
| sealed 类与接口(JEP 409) | — | — | 17 | 17 | 17 | 17 |
| record 模式(JEP 440) | — | — | — | 21 | 21 | 21 |
| switch 模式匹配(JEP 441) | — | — | 17 预览 | 21 | 21 | 21 |
| 未命名变量与模式(JEP 443 / 456) | — | — | — | 21 预览 | 22 | 22 |
| 紧凑源文件与实例 main(JEP 445 / 512) | — | — | — | 21 预览 | 25 | 25 |
| String Templates(JEP 430 / 459) | — | — | — | 21 预览 | — | — |
数字为首次正式版本;p 表示该版本为预览。String Templates 在 22 二次预览后未进入 23,后续版本需查对应 JEP。
并发与线程CONCURRENCY
从 CompletableFuture 到虚拟线程,再到结构化并发与 Scoped Values,Java 的并发模型正在从「线程池 + ThreadLocal」转向「轻量任务 + 结构化作用域」。
| 并发与线程 | JDK 8 | JDK 11 | JDK 17 | JDK 21 | JDK 25 | JDK 27 |
|---|---|---|---|---|---|---|
| CompletableFuture | 8 | 8 | 8 | 8 | 8 | 8 |
| ForkJoinPool / 并行流 | 8 | 8 | 8 | 8 | 8 | 8 |
| ExecutorService 实现 AutoCloseable | — | — | 19 | 19 | 19 | 19 |
| Thread.sleep(Duration) | — | — | 19 | 19 | 19 | 19 |
| 虚拟线程(JEP 444) | — | — | — | 21 | 21 | 21 |
| 结构化并发(JEP 453 等) | — | — | — | 21 预览 | 21 预览 | 21 预览 |
| Scoped Values(JEP 446 / 506) | — | — | — | 21 预览 | 25 | 25 |
| Thread.ofVirtual / threadId | — | — | — | 21 | 21 | 21 |
虚拟线程在 21 正式;结构化并发到 27 仍是预览;Scoped Values 在 25 正式(JEP 506)。
集合与核心 APIAPI
集合框架的补丁往往比语言特性更影响日常代码:工厂方法、不可变集合、SequencedCollection 的首尾统一抽象,都是「写起来更顺」的关键。
| 集合 / 核心 API | JDK 8 | JDK 11 | JDK 17 | JDK 21 | JDK 25 | JDK 27 |
|---|---|---|---|---|---|---|
| List.of / Set.of / Map.of | — | 9 | 9 | 9 | 9 | 9 |
| Map.entry / Optional.isEmpty | — | 11 | 11 | 11 | 11 | 11 |
| String.strip / isBlank / repeat | — | 11 | 11 | 11 | 11 | 11 |
| HttpClient | — | 11 | 11 | 11 | 11 | 11 |
| Collectors.teeing | — | — | 12 | 12 | 12 | 12 |
| Stream.toList | — | — | 16 | 16 | 16 | 16 |
| SequencedCollection(JEP 431) | — | — | — | 21 | 21 | 21 |
| String.splitWithDelimiters | — | — | — | 21 | 21 | 21 |
| Stream Gatherers(JEP 461 / 485) | — | — | — | 24 预览 | 25 | 25 |
SequencedCollection 统一了 List / Deque / LinkedHashSet / SortedSet / LinkedHashMap / SortedMap 的首尾操作与反向视图。
GC 与运行时RUNTIME
GC 的演进方向是「更低停顿 + 更少调参」:G1 成为默认,ZGC 从实验到分代再到唯一模式,Shenandoah 持续低延迟路线,JDK 27 让 G1 在所有环境默认。
| GC 演进 | JDK 8 | JDK 11 | JDK 17 | JDK 21 | JDK 25 | JDK 27 |
|---|---|---|---|---|---|---|
| Parallel GC 默认 | 8 | — | — | — | — | — |
| G1 默认 | — | 9 | 9 | 9 | 9 | 9 |
| ZGC(JEP 333 / 377) | — | — | 15 | 15 | 15 | 15 |
| 分代 ZGC(JEP 439) | — | — | — | 21 | 21 | 21 |
| ZGC 分代模式默认(JEP 474) | — | — | — | — | 23 | 23 |
| ZGC 仅分代(JEP 490 移除旧模式) | — | — | — | — | 24 | 24 |
| Shenandoah 产品化(JEP 379) | — | — | 15 | 15 | 15 | 15 |
| CMS | 8 | 8 | — | — | — | — |
| G1 全环境默认(JEP 523) | — | — | — | — | — | 27 |
CMS 在 14 移除;G1 自 9 起默认;ZGC 在 21 增加分代,23 分代默认,24 移除非分代模式。
移除清单REMOVED
升级真正的成本常在移除项,而不是新特性。下表只列结构性移除;每个版本页有更完整的说明。
| 版本 | 移除项 | 说明 |
|---|---|---|
| JDK 10 | javah 工具(JEP 313) | 由 javac -h 取代,生成 JNI 头文件。 |
| JDK 11 | Java EE 与 CORBA 模块(JEP 320) | 从 JDK 移除,需单独引入 Jakarta EE 实现。 |
| JDK 14 | CMS GC(JEP 363) | 由 G1 取代;启动参数中的 CMS 组合会失效。 |
| JDK 15 | Nashorn JavaScript 引擎(JEP 372) | 需要脚本能力时改用 GraalJS 等外部引擎。 |
| JDK 17 | RMI Activation(JEP 407) | RMI 本身保留,Activation 机制移除。 |
| JDK 17 | Security Manager(JEP 411,弃用) | 弃用而非立即移除;24 起永久禁用。 |
| JDK 18 | finalization(JEP 421,弃用) | 改用 try-with-resources、Cleaner 等显式资源管理。 |
| JDK 21 | 动态加载 Agent(JEP 451,警告) | 运行时 attach 会警告;启动时 -javaagent 不受影响。 |
| JDK 24 | Security Manager 启用能力(JEP 486) | 永久禁用,相关 API 不再可用。 |
| JDK 24 | 非分代 ZGC(JEP 490) | 只保留分代模式,旧参数需要清理。 |
| JDK 24 | Windows 32-bit x86 端口(JEP 479) | 32 位 Windows 构建不再提供。 |
| JDK 25 | 32-bit x86 端口(JEP 503) | 所有平台的 32 位 x86 支持移除。 |
| JDK 26 | Applet API(JEP 504) | 浏览器插件时代结束,Applet 相关 API 移除。 |
真编译矩阵VERIFIED
下面这些结论不是查文档写的,而是在本机已安装的 JDK 上实际编译/运行验证的。✓ 表示通过,× 表示编译失败或行为不符。
| 示例 | JDK 8 | JDK 11 | JDK 17 | JDK 21 | JDK 24 | JDK 25 | 源码 |
|---|---|---|---|---|---|---|---|
| var(JEP 286) | × | ✓ | ✓ | ✓ | ✓ | ✓ | VarDemo.java |
| 文本块(JEP 378) | × | × | ✓ | ✓ | ✓ | ✓ | TextBlockDemo.java |
| record(JEP 395) | × | × | ✓ | ✓ | ✓ | ✓ | RecordDemo.java |
| sealed(JEP 409) | × | × | ✓ | ✓ | ✓ | ✓ | SealedDemo.java |
| instanceof 模式(JEP 394) | × | × | ✓ | ✓ | ✓ | ✓ | InstanceofPatternDemo.java |
| switch 表达式(JEP 361) | × | × | ✓ | ✓ | ✓ | ✓ | SwitchExpressionDemo.java |
| record 模式 + switch 模式(JEP 440 / 441) | × | × | × | ✓ | ✓ | ✓ | RecordPatternDemo.java |
| SequencedCollection(JEP 431) | × | × | × | ✓ | ✓ | ✓ | SequencedDemo.java |
| 虚拟线程(JEP 444) | × | × | × | ✓ | ✓ | ✓ | VirtualThreadDemo.java |
| 紧凑 main(JEP 445 / 463 / 495 / 512) | × | × | × | 预览 | 预览 | ✓ | CompactMain.java |
实测命令:javac -d out code/<Sample>.java;预览项加 --enable-preview --release <N>。JDK 21/24 的紧凑 main 需要预览,JDK 25 已正式。
版本时间线20
数据来源SOURCES
版本发布日期与 JEP 列表来自 OpenJDK 官方项目页(openjdk.org/projects/jdk/N/);API 签名使用本机 JDK 21 的 javap 核对;真编译矩阵使用本机 JDK 8 / 11 / 17 / 21 / 24 / 25 实测。预览特性状态以对应版本的 JEP 为准。