我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java 21 新特性和改进

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 集合框架中的已有类也进行了调整。更新之后的集合框架的类结构如下图所示。

9d561aa464cf4b9648b75b366aa2adb6.png

记录类型的模式(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://blog.csdn.net/cheng_fu/article/details/130920087

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java 21 新特性和改进

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java 21:最新特性、性能改进和语言发展

文章目录 模式匹配和模式变量新的记录类型生产者接口本地类型推断的扩展新的垃圾收集器动态CDS档案G1垃圾收集器的增强Java语言的持续发展性能改进和JEPJava 21的部署和使用Java 21的生态系统结语 &#x
Java 21:最新特性、性能改进和语言发展
2023-12-23

Flex2.0.1新特性和所做改进有哪些

这篇文章主要介绍了Flex2.0.1新特性和所做改进有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Flex2.0.1介绍我们在2006年6月份发布了AdobeFlex2
2023-06-17

Java 8的新特性以及改进有哪些

Java 8的新特性以及改进有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。这篇文章是对Java 8中即将到来的改进做一个面向开发者的综合性的总结,JDK的这一特性将会在2
2023-06-17

PHP8.2将有哪些改动(性能改进、新特性)!

目前PHP8.2的发布时间还没有确定,但是预计将在2022年末发布。这篇文章将为你介绍在新版本中的功能、性能改进、弃用的特性等。相关推荐:PHP8.2最新进展,即将进行新特性冻结!null和false将作为独立的类型PHP并不会陷入到完美的类型安全方向中,但是从技术的角度考虑,将null和false作为独立的数据类型是值得的。一般情况下,PHP的很多常见的函数,会通过返回false表示出错了。比如在
2022-07-04

ASP.NET 4.0新特性的改进有哪些

这期内容当中小编将会给大家带来有关ASP.NET 4.0新特性的改进有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。ASP.NET 4.0新特性中,关于ClientID的改进可以在执行嵌套空间时,控制
2023-06-17

Python Django的未来:即将发布的新特性和改进

随着Python Django的最新版本8.0即将发布,让我们展望这款流行的Web框架的未来,了解即将发布的新特性和改进。
Python Django的未来:即将发布的新特性和改进
2024-02-26

numpy版本更新解读:新特性与改进的性能

随着数据科学和深度学习的不断发展,Python作为主流的编程语言之一,其科学计算库numpy也在不断推陈出新。最近,numpy发布了新的版本,其中包含了一些新特性和性能改进。在这篇文章中,我们将深入探讨numpy的新版本,介绍其中一些重要的
numpy版本更新解读:新特性与改进的性能
2024-01-19

Java 21正式发布,15大特性一览

Java 开发工具包(JDK) 21 是 Oracle 标准 Java 实现的最新长期支持 (LTS) 版本,现已推出生产版本。比较实用的我看就5个,字符串模板、有序集合、记录模式、switch的模式匹配、虚拟线程,其他一般也用不大到。

React 19 终于来了!带来了诸多新特性和改进

React 19 的升级带来了一系列重要的改进,尽管其中涉及到一些破坏性变更,但 React 团队已经努力使升级过程变得更顺畅,预计对大多数应用的影响有限。本文将剖析 React 18.3 与 React 19 的更新内容,并探索 Reac

要不要升级?Java 21强大的新特性,代码量减半

FMT 是 Java 平台定义的另一种模板处理器。FMT 与 STR 类似,它执行插值,但也解释嵌入式表达式左侧的格式规范。格式说明符与 java.util.Formatter 中定义的格式说明符相同。
FMTJavaSTR2024-11-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录