Java 21 特性及示例

2025 年 3 月 19 日 | 阅读 8 分钟

备受期待的 Java 开发工具包 (JDK) 21 现已正式发布。 它带来了大量新特性,应该可以改进 Java 编程。 让我们来看看此版本中包含的主要改进和调整。

1. JEP 430 - 字符串模板

Java 21 最值得关注的创新之一是引入了字符串模板,这是一个在 JEP 430 下提出的预览语言特性和 API。 这项由 Jim Laskey 领导的改进,旨在改进 Java 当前的文本块和字符串字面量。 借助字符串模板,开发人员可以通过将字面文本与模板处理器和嵌入式表达式结合起来,更轻松地创建专门的结果。

此特性有望提高 Java 程序的表达能力,并提供灵活性和安全性,同时更好地理解和使用来自非 Java 语言的字符串 API。

2. JEP XYZ 的结构化并发

在 JDK 21 中,结构化并发成为焦点。 它通过 API 将在单独线程中执行的相关活动组视为一个工作单元,从而简化并发编程。 目前此特性处于预览阶段,它简化了错误处理和取消,提高了可靠性和可观察性。 有趣的是,JDK 20 和 JDK 19 用于结构化并发的孵化,JDK 21 在 Java 中包含了一个用于它的预览 API。util.concurrent 包。

3. JEP XYZ - 作用域值

作用域值是一个新的预览特性,允许在线程之间和线程内部共享不可变数据。 作用域值为大型程序中组件之间的数据共享提供了一种比方法参数更安全的替代方案,解决了线程局部变量的缺点。 此特性在 JDK 20 中开发,性能、稳健性、可理解性和易用性是其首要考虑因素。

4. 密钥封装机制 API

JEP XYZ JDK 21 包含一个密钥封装机制 API,该 API 提供了一种基于公共密码学的加密方法来保护对称密钥。 此改进使 KEM 算法的使用更加容易,支持 RSA-KEM 和 ECIES 方法。

5. Windows 32 位 x86 端口弃用 - JEP XYZ

JDK 21 建议弃用 Windows 32 位 x86 端口,以优化系统完整性并简化流程。 此端口最终将在更高版本中删除。 这需要升级构建系统,以便任何配置 Windows 32 位 x86 构建的尝试都会导致错误消息。 该策略是在 Windows 10(支持 32 位功能的 Windows 操作系统的最终版本)于 2025 年 10 月终止生命周期之前。

6. 匿名类和实例 Main 方法

为了使学生在 Java 中的第一个学习曲线更容易,JEP XYZ JDK 21 提供了匿名类和实例 main 方法的预览。 通过使用此特性,学生可以为仅需要一个类的程序创建简洁的声明,并在他们的熟练程度提高时添加更复杂的功能。 该计划非常强调向 Java 的轻松过渡,减少了创建诸如脚本和命令行工具之类的基本 Java 程序相关的形式。

7. JEP XYZ - 未命名的模式和变量

JDK 21 提供的未命名模式和变量的预览进一步增强了该语言的多功能性。 未命名的变量可以初始化但从未使用过,而未命名的模式匹配记录组件,而无需提及组件的名称或类型。

8. JEP XYZ - 分代 ZGC

通过扩展 ZGC 以为年轻和年老的项目保留不同的世代,分代 ZGC 被证明是一个主要的性能提升。 此改进允许 ZGC 更频繁地收集年轻对象,从而降低了分配延迟的可能性,并降低了与垃圾回收相关的内存开销和 CPU 开销。 在使用分代 ZGC 而不是非分代 ZGC 时,应用程序应该会看到性能的提高,而吞吐量没有明显下降。

9. 记录模式 - JEP XYZ

JDK 21 中引入了记录模式,并构建在 JDK 19 和 20 中的先前预览之上。 借助此功能,可以分解记录值,并且可以嵌套记录模式和类型模式以创建更模块化的数据搜索。 通过扩展模式匹配,该提案提供了一种强大、表达力强且模块化的数据处理和导航方法。

10. Switch 模式匹配 - JEP XYZ

在多个 JDK 版本(JDK 17、JDK 18、JDK 19 和 JDK 20)中改进后,Switch 模式匹配最终在 JDK 21 中完成,并根据用户输入和体验进一步改进。 此改进可以针对模式测试 switch 表达式或语句,从而可以安全有效地执行复杂的数据导向搜索。 在 case 标签中包含限定的枚举常量和消除带括号的模式是两个值得注意的修改。

11. 向量 API (孵化器) - JEP XYZ

JDK 21 继续进行向量 API 的孵化,该 API 表示向量计算,这些计算在受支持的 CPU 架构上编译为最佳向量指令。 该 API 从 JDK 16 改进到 JDK 20,强调可靠的运行时编译和 x64 和 AArch64 平台上的效率,以及简洁明了的表达。

12. 外部函数和内存 API 的第三个预览版 - JEP XYZ

JDK 21 的外部函数和内存 API 的第三个预览版使 Java 更兼容不属于 Java 运行时的代码和数据。 通过消除与 JNI 相关的脆弱性,此 API 使安全访问外部内存和有效地调用外部函数变得更容易。

13. 虚拟线程

JDK 21 完成了虚拟线程,这是一种轻量级线程解决方案,最初在 JDK 20 和 JDK 19 中展示。 此特性允许通过接近最佳硬件利用率进行简单扩展,这应该可以简化高吞吐量并发应用程序。 JDK 21 中对虚拟线程中线程局部变量的持续支持确保了与当前库的兼容性,并促进了面向任务编程到虚拟线程的过渡。

14. JEP XYZ 排序集合

排序集合提案添加了接口来表示具有预定遇到顺序的集合,填补了 Java 集合框架中的需求。 此改进指定了用于排序集合、集和映射的接口,并提供了用于以相反顺序处理组件的一致 API。 该提案的目的是解决集合类型不足的问题,该集合类型可以表示具有指定遇到顺序的一系列组件。

15. 结构化并发 - JEP 430

结构化并发编程范例的目标是简化并发编程。 这种范例通过 JEP 430 在 Java 21 中作为预览特性提供。 将在单独线程中执行的相关作业集群视为一个工作单元是主要目标。 这种方法通过简化错误管理和取消来提高并发编程的可靠性和可观察性。

Java 21 中的 java.util.concurrent 包包含一个用于结构化并发的预览 API,该 API 已在 JDK 20 和 JDK 19 中开发。 它涵盖了典型的取消和关闭风险,例如取消延迟和线程泄漏。 Java 21 中的 StructuredTaskScope::Fork(...) 函数已发生重大更改; 现在它返回 [Subtask] 而不是 Future。

目标

结构化并发旨在提高并发代码的可观察性,并鼓励一种消除取消和关闭风险的并发编程风格。

16. 外部函数和内存 API (第三个预览版) - JEP XYZ

通过来自 Java 运行时外部的代码和数据,Java 的互操作性旨在通过外部函数和内存 API 得到改进。 此 API 是 Java 21 的第三个预览版本,提供了对外部内存的安全访问和对外部函数的快速调用。 它旨在消除与 Java 本机接口 (JNI) 相关的风险和脆弱性。

意义

JDK 21 预览版有多个改进,例如改进的布局路径、集中式本机段寿命管理、后备本机链接器的实现以及 VaList 的消除。 通过允许 Java 程序处理本机数据和访问本机库,该 API 扩大了可能发生在 Java 运行时之外的交互范围。

目标

外部函数和内存 API 旨在提供速度、安全性、通用性和易用性。 它旨在为 JNI 提供一种可靠的替代方案,使调用外部函数成为可能,而不会危及程序安全性。

17. 排序集合 - JEP XYZ

Java 21 的排序集合通过提供用于表示具有指定遇到顺序的集合的接口来填补集合框架中的需求。 任何集合的第一个、第二个和最后一个项目都清楚地声明。 为了以相反顺序处理数据并接受第一个和最后一个元素,开发了统一的 API。

该提案解决了 Java 集合框架中长期存在的问题,即没有集合类型来表示具有指定遇到顺序的一系列组件。 排序集合通过尝试为这些集合提供一组一致的操作来解决没有序列特定集合类型的问题。

目标

排序集合提案的目标包括定义用于排序集合、集和映射的接口,将这些接口改造到现有的集合类型层次结构中,并为新方法提供默认实现。

18. 代理的动态加载 - JEP XYZ

将 Java 代理动态加载到活动 Java 虚拟机 (JVM) 中的能力称为“代理的动态加载”。 由 JDK 5 中的 Java 平台分析架构引入,代理是在程序执行时可以更改应用程序代码的部件。 代理可以动态加载,从而可以通过分析器等工具实现类的运行时检测。

Java 21 的动态加载提案主要围绕在将代理动态加载到活跃 JVM 中时生成的警告。这些警告旨在为后续版本做好准备,届时,为了提高完整性,默认情况下可能会阻止代理的动态加载。此外,该提案还特别强调将代理的动态加载与其他功能同步,获得应用程序所有者的许可,以及使 Java 平台更接近默认的完整性。

该提案旨在重新评估可维护性与完整性之间的权衡,将动态代理加载与其他“超级能力”功能同步,并保持与不需要动态代理加载的工具的兼容性。

19. Switch 的模式匹配 (JEP XYZ)

借助 Switch 的模式匹配功能,可以根据一组模式评估 switch 表达式或语句,每个模式都有一个不同的操作。JDK 17 是此功能的起点,并在 JDK 18、JDK 19 和 JDK 20 版本中进行了改进。它在 JDK 21 中完成,并根据用户评论和经验得到了进一步改进。

Switch 的模式匹配的目标是提高 Java switch 表达式和语句的表达性和实用性。借助此功能,开发人员可以通过允许模式出现在 case 标签中,以清晰且安全的方式描述复杂的数据导向型搜索。此外,它还提供了一种在需要时缓解 switch 过去对 null 的敌意的方法。

目标

增强的表达性: 通过允许在 case 标签中使用模式,该创新希望使 switch 语句更具适应性和表达性。

Null 敌意的放松: 通过允许在 switch 表达式和语句中使用模式,可以在需要时缓解 switch 的历史 null 敌意,从而在处理 null 值时提供额外的灵活性。

提高安全性: 通过强制模式 switch 语句覆盖所有可能的输入值,模式匹配的包含有助于提高 switch 语句的安全性。

结论

总而言之,JDK 21 是 Java 致力于发展和创新的证据。借助这些功能,开发人员现在可以提高其 Java 程序的表达性、可靠性和速度。随着 Java 的发展,这些改进为更可靠和有效的程序开发打开了大门。