Java 21即将发布,探索Java 21新特性和改进

图片

一、简介

Java 21是 Java 17之后的下一个 LTS版本。虚拟线程在 Java 21中将成为正式功能。Java 21 有望将会成为继 java8 之后又一个流行的 Java 版本。

二、发布时间

Java 21将在 2023 年 9 月 19 日发布

三、Java 21新特性和改进

3.1 正式功能

  • 虚拟线程 (Virtual Threads)

  • 顺序集合(Sequenced Collections)

  • 记录类型的模式(Record Patterns)

  • switch 的模式匹配(Pattern Matching for switch)

  • 分代式 ZGC (Generational ZGC)

  • 废弃 Windows 32 位版本(Deprecate the Windows 32-bit x86 Port for Removal)

  • 准备禁止动态加载代理(Prepare to Disallow the Dynamic Loading of Agents)

  • 密钥封装机制API(Key Encapsulation Mechanism API)

3.2 预览功能

  • 未命名类和实例 main 方法(Unnamed Classes and Instance Main Methods)

  • 字符串模板 (String Templates)

  • 未命名模式和变量 (Unnamed Patterns and Variables)

  • 外部方法和内存 API (Foreign Function & Memory API)

  • 结构化并发(Structured Concurrency )

  • 作用域值(Scoped Values)

3.3 孵化功能

  • 向量 API (Vector API)

3.4 试验功能

  • 分代式 Shenandoah(Generational Shenandoah)

四、功能说明

4.1 虚拟线程

  • 虚拟线程会改变 Java 的多线程编程。虚拟线程会成为 Java 21 的杀手锏功能,促使更多用户升级到 Java 21。

4.2 顺序集合

  • 顺序集合中的元素有确定的出现顺序(encounter order)。Java 21 新增了与顺序集合相关的接口,统一了与顺序集合相关的操作,包括获取第一个和最后一个元素,在集合的头部和尾部插入和删除元素,以及逆序遍历集合等。

  • 新增的顺序集合相关的接口包括 SequencedCollection、SequencedSet 和 SequencedMap。Java 集合框架中的已有类也进行了调整。

4.3 switch 的模式匹配

  • 增强 Java 中的 switch 表达式和语句,允许在 case 标签中使用模式。当模式匹配时,执行 case 标签对应的代码。

4.4 分代式 ZGC

  • 增强 Z 垃圾回收器(ZGC)来支持不同的世代。年轻和年老的对象分别存放在不同的世代中,使得年轻的对象可以更加频繁的被回收。

4.5 废弃 Windows 32 位版本

  • 废弃 Windows 32 位 x86 版本,将在以后的 OpenJDK 版本中删除。

  • Windows 10,支持 32 位的最后一个 Windows 操作系统,将在2025年10月终止。结束对 Windows 32位 x86 版本的支持,可以把精力转移到更加重要的事情上。

  • 虚拟线程在 Windows 32 位 x86 版本的实现回退到了使用内核线程,没办法享受到 Loom 项目带来的好处。

4.6 未命名类和实例 main 方法

  • 该 JEP 的目标是简化 Java 的入口类。一直以来,Java 的入口类的 main 方法的声明有着很严格的要求,必须是 public static void main(String[] args)。对于 Java 初学者来说,这个 main 方法的声明引入了太多的 Java 语法概念,不利于初学者快速上手。

  • 在经过简化之后,不再对 main 方法的声明进行严格的限制,而是允许多种声明方式。

  • 未命名类允许省略外层的 Java 类声明,直接把 main 方法作为顶层元素,写在 Java 源代码文件中。main 方法所依赖的其他方法和字段,也同样作为顶层元素。Java 编译器会自动生成一个匿名类,并调用其中的 main 方法。

4.7 字符串模板

  • 字符串模板是 Java 一直以来缺少的功能。Java 21 的字符串模板是一个通用的实现,可以把任何字符串转换成任意类型的对象。

  • 字符串模板的实现由两个部分组成,分别是 StringTemplate 表示的模板,以及 StringTemplate.Processor 表示的模板处理器。StringTemplate 表示的模板中包含需要求值的表达式,如 \{name} 表示获取 name 的值。

  • Java 内置提供了几个模板处理器的实现。STR 用来对包含表达式的字符串模板进行求值。

  • FMT 可以进行格式化,使用的是 java.util.Formatter 支持的语法。

  • RAW 生成一个不对字符串做任何处理的 StringTemplate 对象。

  • 可以创建自定义的字符串模板处理器来生成非 String 类型的对象。

4.8 未命名模式和变量

  • 下划线终于来了。可以使用下划线表示未命名的变量,以及模式匹配时不使用的组件。

  • 未命名变量的典型场景是 try-with-resources 语句和 catch 子句中的异常变量。

  • 未命名模式是一个无条件的模式,并不绑定任何值。未命名模式变量出现在类型模式中。

4.9 外部方法和内存 API

  • 外部方法和内存 API提供了一种新的方式来与 Java 运行时之外的代码和数据来进行互操作。该 API 可以高效调用外部方法,并安全访问外部内存。该 API 用来替代 JNI。

4.10 矢量 API

  • Vector API 是 OpenJDK 中 Panama 项目的一部分。Vector API 的作用是描述矢量计算,并在运行时编译成 CPU 架构上的矢量计算指令。

  • 矢量是一组标量值的序列。标量值的数量取决于硬件定义的 vector lane 的数量。在对两个矢量进行计算时,会在每条 lane 上对两个矢量相应的标量值进行计算。通过并行计算,两个矢量计算的速度与单个标量值的计算速度是相同的,极大地提高了计算速度。这被称为 SIMD(Single Instruction Multiple Data),单指令多数据。

  • HotSpot 虚拟机已经支持自动的矢量化,但是存在很大的局限性,开发人员难以有效的利用。Vector API 提供了一种方式来编写复杂的矢量算法。虽然底层仍然使用的是 HotSpot 的自动矢量化,但是矢量化的结果更加可靠。

4.11 分代式 Shenandoah

  • 为垃圾回收器 Shenandoah 增加了分代式支持。

五、其他版本特性

5.1 Java 8 (2014年3月发布) LTS长期维护,延长公共维护结束时间:2030年12月

  • Lambda 表达式、方法引用和函数接口,用于更简洁和灵活的编程。

  • 新的日期/时间 API,提供了更好的 API 设计和性能。

  • PermGen 空间被移除,取而代之的是 Metaspace 内存区域。

  • 并行数组支持。

  • Nashorn JavaScript 引擎。

5.2 Java 9 (2017年9月发布)

  • 模块系统,提供了更好的组件化和可靠性。

  • 改进的 Javadoc,包括搜索、注释等功能。

  • 改进的 HTTP/2 客户端。

  • 集合工厂方法,简化了集合的创建。

  • Reactive Streams API,用于响应式编程。

  • 私有接口方法,允许默认方法和静态方法直接访问。

  • JShell,交互式 Java REPL 工具。

5.3 Java 10 (2018年3月发布)

  • var 局部变量类型推断,允许声明变量时不必显式指定类型。

  • 改进的 G1 垃圾收集器,增强了吞吐量和 GC 时间预测。

  • 支持 Unicode 10。

  • 应用类数据共享(Application Class-Data Sharing)。

5.4 Java 11 (2018年9月发布) LTS长期维护,公共维护结束时间:2026年9月

  • HTTP 客户端标准化,替换了不稳定的 HttpURLConnection API。

  • 改进的 ZGC 垃圾收集器,支持大内存和低延迟应用场景。

  • Epsilon 垃圾收集器,用于短暂测试和性能调优。

  • 序列化过滤器,提供了更好的安全性。

  • 支持 Unicode 10.0.0。

5.5 Java 12 (2019年3月发布)

  • Shenandoah 垃圾收集器,用于大型堆内存。

  • 新的 Switch 表达式语法,可以更方便地编写条件语句。

  • 改进的 G1 垃圾收集器,增强了吞吐量和 GC 时间预测。

  • Microbenchmark Suite,用于精确测量代码性能。

5.6 Java 13 (2019年9月发布)

  • Text Block,一种新的 String 文本块语法。

  • ZGC 和 Shenandoah 垃圾收集器增强。

  • 改进的 Switch 表达式语法。

  • Dynamic CDS Archives,缩短了应用程序启动时间。

  • 支持 Unicode 12.0.0。

5.7 Java 14 (2020年3月发布)

  • Records,一种新的类声明语法,用于声明数据模型。

  • Pattern Matching for instanceof,增强了类型模式匹配。

  • NUMA-Aware Memory Allocation,提高了 JVM 的性能和伸缩性。

  • 支持 Unicode 12.1。

5.8 Java 15 (2020年9月发布)

  • Text Blocks 增强,包括更好的换行支持和缩进控制。

  • Sealed Classes,用于定义受限制的类继承层次关系。

  • Hidden Classes,用于隐藏类的实现细节。

  • 支持 Unicode 13.0.0。

5.9 Java 16 (2021年3月发布)

  • Records 增强,包括继承、泛型类型和属性的支持。

  • Pattern Matching for instanceof 和 Switch 表达式增强。

  • Vector API,用于支持高性能向量运算。

  • JEP 390,取消了警告消息。

5.10 Java 17 (2021年9月发布) LTS长期维护,公共维护结束时间:2029年9月

  • 原生嵌套(Native Support for Nested Based Access Control),用于在一个类中嵌套另一个类。

  • Sealed Class 和 Hidden Class 增强。

  • 支持嵌套开发环境 API。

  • FFI(Foreign Function Interface),用于通过本地语言调用本地代码。

  • 安全加密随机数生成器。

5.11 Java 18 (2022年3月发布)

  • 默认 UTF-8 字符编码

  • 简单的 Web 服务器 jwebserver

  • Javadoc 中支持代码片段

  • 使用方法句柄重新实现反射核心功能

  • 互联网地址解析 SPI

  • Vector API

  • Foreign Function & Memory API

5.12 Java 19 (2022年9月发布)

  • 将 JDK 移植到 Linux/RISC-V 平台

  • 记录模式 (Record Patterns) 

  • 外部函数和内存 API (Foreign Function & Memory API) 

  • 虚拟线程 (Virtual Threads) 

  • 向量 API (Vector API) 

  • switch 模式匹配 (Pattern Matching for switch) 

  • 结构化并发 (Structured Concurrency) 

5.13 Java 20 (2023年3月发布)

  • 作用域值(Scoped Values)

  • 记录模式(Record Patterns)

  • switch 模式匹配(Pattern Matching for switch)

  • 外部函数和内存 API(Foreign Function & Memory API)

  • 虚拟线程(Virtual Threads)

  • 结构化并发(Structured Concurrency)

  • 向量 API(Vector API)

图片

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年10月17日
下一篇 2023年10月17日

相关推荐