从 JDK 8 到 JDK 17,Java 经历了 9 个主版本迭代,其中JDK 11、JDK 17 为官方长期支持(LTS)版本,也是企业从 JDK 8 升级的主流目标。整体演进方向包括:语法简化、API 现代化、低延迟 GC、模块化、原生性能优化、安全性增强。
下面按版本顺序梳理核心新特性,重点标注最终正式落地的能力。
一、JDK 9(2017):模块化革命与基础能力补齐
这是 Java 历史上架构改动最大的版本之一,核心为 Jigsaw 模块化项目。
- Java 模块系统(Project Jigsaw)
- 引入
module-info.java定义模块的依赖、导出与开放权限,实现类的强封装,解决传统类路径混乱问题。 - JDK 自身拆分为数十个模块,支持按需裁剪运行时。
- 引入
- 集合工厂方法
- 新增
List.of()、Set.of()、Map.of()/Map.ofEntries(),一行代码创建不可变集合,替代繁琐的Arrays.asList或双大括号初始化。
- 新增
- 接口私有方法
- 接口中允许定义
private方法(含静态与实例),供default方法复用内部逻辑。
- 接口中允许定义
- 语法小增强
- try-with-resources 支持直接使用已声明的 final / 有效 final 变量,无需重新包装。
- 钻石操作符
<>支持匿名内部类。
- Stream & Optional 增强
- Stream 新增
takeWhile、dropWhile、ofNullable、带终止条件的iterate重载。 - Optional 新增
ifPresentOrElse、or、stream方法。
- Stream 新增
- 响应式流 Flow API
- 内置
Publisher/Subscriber/Subscription/Processor标准接口,对齐 Reactive Streams 规范。
- 内置
- 进程与工具增强
- 新增
ProcessHandle接口,原生支持获取进程信息、管理子进程。 - G1 垃圾回收器成为默认 GC。
- 新增
jlink:生成裁剪后的定制化 JRE 镜像,减小部署体积。 - 新增
jshell:交互式 Java REPL 工具,方便快速验证代码。 - 支持多版本兼容 JAR(Multi-Release JAR),同一个 JAR 可适配不同 JDK 版本。
- 新增
二、JDK 10(2018):局部变量类型推断
- 局部变量类型推断
var- 局部变量声明时可用
var替代具体类型,编译器自动推断,大幅简化泛型等冗长声明。 - 仅适用于方法内局部变量、for 循环变量,不可用于成员变量、方法参数、返回值。
- 局部变量声明时可用
- 性能与运行时优化
- G1 支持并行 Full GC,大幅降低最坏情况停顿时间。
- 应用类数据共享(AppCDS)正式化,降低应用启动时间与内存占用。
- 开源根证书集
- OpenJDK 默认内置 Oracle 根 CA 证书,解决原生环境 HTTPS 握手失败问题。
三、JDK 11(2018,LTS):API 现代化与生态精简
第二个长期支持版本,也是很多企业当前的生产基线版本。
- 语法小更新
- Lambda 表达式参数支持
var声明,如(var x, var y) -> x + y,便于给参数添加注解。
- Lambda 表达式参数支持
- 字符串 API 大幅增强
- 新增
isBlank()、strip()/stripLeading()/stripTrailing()(支持 Unicode 全角空白,比trim更通用)、lines()、repeat(int)。
- 新增
- 文件 IO 增强
Files.readString()/Files.writeString():直接读写字符串到文件,无需手动包装流。- 新增
Path.of()作为Paths.get()的更简洁替代。
- HttpClient 正式化
- 替代老旧的
HttpURLConnection,原生支持 HTTP/1.1、HTTP/2、WebSocket,提供同步 / 异步请求模式。
- 替代老旧的
- 工具与诊断
- 单文件源码直接运行:执行
java Hello.java即可运行单文件代码,无需先javac编译。 - JFR(Java Flight Recorder)飞行记录器正式开源,低开销的性能诊断与问题排查工具。
- 单文件源码直接运行:执行
- GC 与 JVM
- ZGC(实验性):面向 TB 级堆的低延迟 GC,目标停顿时间 < 10ms。
- Epsilon GC:无操作的 "空"GC,用于性能基准测试、极短生命周期应用。
- 移除与废弃
- 移除 Java EE、CORBA 相关模块,交由第三方生态维护。
- JavaFX 从 JDK 剥离,成为独立开源项目。
- 废弃 Nashorn JavaScript 引擎。
四、JDK 12 ~ JDK 16:过渡版本的特性孵化
均为非 LTS 版本,大量语法特性以 "预览 / 孵化器" 状态逐步迭代,最终在 JDK 16/17 正式落地。
JDK 12
- Switch 表达式(预览):引入箭头语法
case X ->,支持返回值,无需手动break。 - Shenandoah GC(实验性):RedHat 主导的低停顿 GC。
- G1 支持可中止的混合 GC,优化停顿控制。
JDK 13
- Switch 表达式二次预览。
- 文本块(预览):用三引号
"""包裹多行字符串,告别换行符拼接。 - 基于 NIO 重新实现传统 Socket API。
JDK 14
- Switch 表达式正式转正。
- instanceof 模式匹配(预览):判断类型后自动绑定变量,省去强制类型转换。
- Record 记录类(预览):不可变数据载体类,自动生成构造器、访问器、equals/hashCode/toString。
- 文本块二次预览。
JDK 15
- 文本块正式转正。
- 隐藏类:供框架动态生成类使用,不暴露给应用类加载器。
- ZGC、Shenandoah GC 正式转正。
- 彻底移除 Nashorn JavaScript 引擎。
- 默认禁用偏向锁。
JDK 16
- instanceof 模式匹配正式转正。
- Record 记录类正式转正。
- 密封类(预览):通过
sealed+permits精确限制类的继承范围。 jpackage打包工具正式:可将 Java 应用打包为 exe、dmg、deb 等平台原生安装包。- Vector API(孵化器):利用 CPU 向量指令加速数值计算。
五、JDK 17(2021,LTS):当前主流升级目标
第三个长期支持版本,语法与 API 趋于成熟,是 JDK 8 之后的下一代企业级标准。
- 核心语言特性
- 密封类(Sealed Classes)正式转正通过
sealed、non-sealed、permits关键字定义封闭的类型层次,精确控制哪些类可以继承 / 实现,配合 Record 可实现代数数据类型(ADT)。 - Switch 模式匹配(预览)支持在 switch 中匹配类型、null、常量模式,大幅简化多分支类型判断逻辑,减少
instanceof+ 强转的样板代码。
- 密封类(Sealed Classes)正式转正通过
- API 增强
- 全新的伪随机数生成器(PRNG)体系:
RandomGenerator接口 + 多种实现,支持可拆分、可跳转的随机数。 - 新增
java.util.HexFormat:标准化的十六进制格式化与解析工具。 - Stream、Collectors、集合框架的小幅易用性优化。
- 全新的伪随机数生成器(PRNG)体系:
- JVM 与 GC
- ZGC 持续优化:停顿时间稳定在亚毫秒级,最大支持 32TB 堆内存,全平台覆盖。
- 恢复始终严格的浮点语义,保证跨平台浮点计算结果一致性。
- 移除实验性的 AOT 编译功能。
- 平台与安全性
- 正式支持 macOS AArch64(Apple Silicon)架构。
- 正式弃用安全管理器(Security Manager),标记为未来移除。
- 移除 RMI 激活机制。
- 孵化器 API
- 外部函数与内存 API:安全、高效地调用本地代码与堆外内存,目标替代 JNI。
- Vector API 第二次孵化器迭代。
整体演进总结
从 JDK 8 到 17,Java 的核心变化可以概括为三点:
- 语法层面:从纯面向对象逐步融合函数式 + 数据导向编程,
var、Record、密封类、模式匹配大幅减少样板代码。 - 运行时层面:低延迟 GC(ZGC/Shenandoah)成熟,模块化、jlink、jpackage 完善了从开发到部署的全链路。
- API 层面:字符串、集合、IO、网络等基础 API 全面现代化,日常开发效率显著提升。
- 生态与工具:JFR 开源、单文件运行、jpackage 打包等工具链增强,提升了开发、调试和部署体验。