Java 21 新特性和改进

这篇具有很好参考价值的文章主要介绍了Java 21 新特性和改进。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java 21 是 Java 17 之后的下一个 LTS 版本。虚拟线程在 Java 21 中将成为正式功能。可以预期的是,Java 21 会成为一个很流行的 Java 版本。

Java 21 将在 2023 年 9 月 19 日发布。目前 Java 21 包含的内容已经基本确定了。下面来梳理一下 Java 21 中会包含的内容。

正式功能

虚拟线程 (Virtual Threads)

自从 Java 19 中引入之后,虚拟线程已经成为了 Java 社区中火热的话题。虚拟线程会改变 Java 的多线程编程。虚拟线程会成为 Java 21 的杀手锏功能,促使更多用户升级到 Java 21。

顺序集合(Sequenced Collections)

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

新增的顺序集合相关的接口包括 SequencedCollectionSequencedSet 和 SequencedMap。Java 集合框架中的已有类也进行了调整。更新之后的集合框架的类结构如下图所示。

java21,java,jvm,开发语言

记录类型的模式(Record Patterns)

记录类型的模式可以解构记录对象中的值,可以方便地提取记录中的组件。

比如下面的记录类型 Point

record Point(int x, int y) {}

通过下面的方式就可以解构出 Point 中的组件 x 和 y

static void printSum(Object obj) {
    if (obj instanceof Point(int x, int y)) {
        System.out.println(x + y);
    }
}

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

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

在下面的代码中,switch 表达式使用了类型模式来进行匹配。

static String formatterPatternSwitch(Object obj) {
    return switch (obj) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> obj.toString();
    };
}

分代式 ZGC (Generational ZGC)

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

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

废弃 Windows 32 位 x86 版本,将在以后的 OpenJDK 版本中删除。之所以废弃 Windows 32位 x86 版本, 主要有几个动机:

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

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

预览功能

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

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

在经过简化之后,不再对 main 方法的声明进行严格的限制,而是允许多种声明方式。具体来说, 在启动的入口类中会按照如下顺序依次查找 main 方法:

  • 首先是 public static void main(String[] args) 方法,

  • 其次是声明为 protected 或 package 的 static void main(String[] args) 方法,

  • 接着是非私有的 static void main() 方法,

  • 然后是非私有的实例方法 void main(String[] args)

  • 最后是非私有的实例方法 void main()

对于后面两种情况,由于调用的是实例方法,需要有入口类的实例。这就要求入口类有一个非私有的,不带任何参数的构造方法。在启动时,首先创建出入口类的对象,再调用对象的 main 方法。

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

在对入口类进行简化之后,只需要下面的代码就可以了。

void main() {
    System.out.println("Hello, World!");
}

字符串模板 (String Templates)

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

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

Java 内置提供了几个模板处理器的实现。STR 用来对包含表达式的字符串模板进行求值。这是通常意义上的字符串模板的用法。

int x = 10, y = 20;
String s = STR."\{x} + \{y} = \{x + y}";

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

record Rectangle(String name, double width, double height) {
    double area() {
        return width * height;
    }
}
Rectangle[] zone = new Rectangle[] {
    new Rectangle("Alfa", 17.8, 31.4),
    new Rectangle("Bravo", 9.6, 12.4),
    new Rectangle("Charlie", 7.1, 11.23),
};
String table = FMT."""
    Description     Width    Height     Area
    %-12s\{zone[0].name}  %7.2f\{zone[0].width}  %7.2f\{zone[0].height}     %7.2f\{zone[0].area()}
    %-12s\{zone[1].name}  %7.2f\{zone[1].width}  %7.2f\{zone[1].height}     %7.2f\{zone[1].area()}
    %-12s\{zone[2].name}  %7.2f\{zone[2].width}  %7.2f\{zone[2].height}     %7.2f\{zone[2].area()}
    \{" ".repeat(28)} Total %7.2f\{zone[0].area() + zone[1].area() + zone[2].area()}
    """;

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

可以创建自定义的字符串模板处理器来生成非 String 类型的对象。下面代码中的 JSON 从字符串模板中生成 JSONObject 对象。

var JSON = StringTemplate.Processor.of(
        (StringTemplate st) -> new JSONObject(st.interpolate())
    );

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

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

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

try (var _ = ScopedContext.acquire()) {
    
}
try { ... } 
catch (Exception _) { ... } 
catch (Throwable _) { ... }

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

if (r instanceof ColoredPoint(_, Color c)) { ... c ... }

switch (b) {
    case Box(RedBall _), Box(BlueBall _) -> processBox(b);
    case Box(GreenBall _)                -> stopProcessing();
    case Box(_)                          -> pickAnotherBox();
}

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

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

Java 21 中是该 API 的第 3 个预览版。

孵化功能

矢量 API (Vector API)

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

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

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

试验功能

分代式 Shenandoah(Generational Shenandoah)

为垃圾回收器 Shenandoah 增加了分代式支持。文章来源地址https://www.toymoban.com/news/detail-724064.html

到了这里,关于Java 21 新特性和改进的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java17 新特性和改进

    Java 17 是 Java 编程语言和标准库的最新版本,是一个非常重要的更新。作为 Java 9 后的第 8 个长期支持版本(LTS),Java 17 带来了一系列有趣的新特性、改进和优化,包括 Sealed Class、Pattern Matching for instanceof、升级的垃圾回收器、ZGC 性能优化等等。在本篇文章中,我们将介绍

    2024年02月01日
    浏览(92)
  • Java21 新特性

    2023年9月19日 ,Oracle 发布了 JDK21,是自 JDK17 之后最新的 LTS 版本(long-term support,长期支持版)。LTS版本一般每两年发布一个,JDK目前的LTS版本有:JDK8 , JDK11 , JDK17 ,JDK21。 Java21新特性:( oracle jdk、openjdk文档) 字符串模板(预览版) 虚拟线程(在JDK19中是预览版,在JDK21中是

    2024年02月03日
    浏览(62)
  • Java 21 新特性(LTS版本)

    JDK 21 于 2023 年 9 月 19 日 发布,这是一个非常重要的版本,里程碑式。 JDK21 是 LTS(长期支持版),至此为止,目前有 JDK8、JDK11、JDK17 和 JDK21 这四个长期支持版了。 官方文档:OpenJDK Java 21 文档 Java各个版本的文档入口:Java平台,标准版文档 Java各个版本下载:https://jdk.java

    2024年04月23日
    浏览(41)
  • 【Java基础系列】JDK21新特性

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月04日
    浏览(43)
  • Java 21 新特性:Record Patterns

    Record Patterns 第一次发布预览是在JDK 19、随后又在JDK 20中进行了完善。现在,Java 21开始正式推出该特性优化。下面我们通过一个例子来理解这个新特性。 上述代码中定义了一个名为Point的record类(Java 16中的新特性),如果我们想要获取、操作或者打印Point中的x和y的话。就不得

    2024年02月08日
    浏览(47)
  • Java 21新特性-虚拟线程 审核中

    本文翻译自国外论坛 medium,原文地址:https://medium.com/@benweidig/looking-at-java-21-virtual-threads-0ddda4ac1be1 Java 21 版本更新中最重要的功能之一就是虚拟线程 (JEP 444)。这些轻量级线程减少了编写、维护和观察高吞吐量并发应用程序所需的工作量。 正如我的许多其他文章一样,在推出

    2024年02月08日
    浏览(57)
  • Java 21 新特性:switch的模式匹配

    在之前的Java 17新特性中,我们介绍过关于JEP 406: switch的模式匹配,但当时还只是关于此内容的首个预览版本。之后在JDK 18、JDK 19、JDK 20中又都进行了更新和完善。如今,在JDK 21中,该特性得到了最终确定!下面,我们就再正式学习一下该功能! 在以往的switch语句中,对于

    2024年02月08日
    浏览(42)
  • Java 21 新特性:虚拟线程(Virtual Threads)

    在Java 21中,引入了虚拟线程(Virtual Threads)来简化和增强并发性,这使得在Java中编程并发程序更容易、更高效。 虚拟线程,也称为“用户模式线程(user-mode threads)”或“纤程(fibers)”。该功能旨在简化并发编程并提供更好的可扩展性。虚拟线程是轻量级的,这意味着它

    2024年02月08日
    浏览(40)
  • Java/JDK 21正式发布!15个特性一览

    JDK 21已经于2023年9月19日正式发布。本文总结了JDK 21发布的新特性。 根据发布的规划,这次发布的 JDK 21 将是一个长期支持版(LTS 版)。LTS 版每 2 年发布一个,上一次长期支持版是 21 年 9 月发布的 JDK 17。 本版本是Java SE平台21版的参考实现,由Java社区流程中的JSR 396指定。 主

    2024年02月08日
    浏览(57)
  • 【Java 21 新特性】顺序集合(Sequenced Collections)

    引入新的接口表示具有定义的遇到顺序的集合。每个这样的集合都有一个明确定义的第一个元素、第二个元素,依此类推,直到最后一个元素。提供统一的API来访问它的第一个和最后一个元素,并以相反的顺序处理它的元素。 \\\"生活只能向后理解;但必须向前生活。\\\"—基尔克

    2024年02月03日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包