Java 21 新特性和改进

news2024/12/24 9:05:15

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 增加了分代式支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/581995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI提示】ChatGPT提示工程课程(吴恩达OpenAI)转换文本(中文chatgpt版)

设置 翻译 通用翻译器 语调变换 格式转换 拼写检查/语法检查。 转换 在本笔记中,我们将探索如何使用大型语言模型进行文本转换任务,例如语言翻译、拼写和语法检查、语气调整和格式转换。 设置 import openai import osfrom dotenv import load_dotenv, f…

Maven初级

Maven初级 Maven简介 传统项目管理状态分析 jar包不统一,jar包不兼容工程升级维护过程操作繁琐 Maven是什么 Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)POM:项目对象模型 Ma…

一图看懂 itsdangerous 模块:将受信任的数据传递到不受信任的环境的帮助工具,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 itsdangerous 模块:将受信任的数据传递到不受信任的环境的帮助工具,资料整理笔记(大全) 🧊摘要🧊模块…

Ae:跟踪摄像机

在时间轴面板上选择要跟踪的素材图层,在跟踪器面板中单击跟踪摄像机 Track Camera按钮之后,会向素材图层添加“3D 摄像机跟踪器” 3D Camera Tracker效果,并立即对视频画面逐帧分析以反求原始摄像机运动。 还有其它几种添加 3D 摄像机跟踪器效…

GeForce RTX 3060 Ti+cuda 11.6+Anaconda3搭建Pytorch深度学习环境

室友新购入一个笔记本,笔记本的显卡是GeForce RTX 3060 Ti,记录一下使用GeForce RTX 3060 Ticuda 11.6Anaconda3搭建Pytorch深度学习环境。 安装很简单,当你有了Python环境时记住一个核心命令即可,显卡驱动因该在之前已经安装过了…

ChatGPT 与我合力开发 xargin blog archive 插件:曹大博客的新奇探险

之前写的批量删除 chatGPT 对话的插件[1],最近我收到了一个五星好评: 虽然不赚钱,交个朋友嘛,还是挺高兴的。而且借助 chatGPT,我是在与全世界的用户交流,想想就激动。 最近我发现自己让 chatGPT 帮忙写前端…

jQuery其他方法及插件使用

1. 拷贝对象 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width,…

跨域 + 四种解决办法

目录 同源策略 解决方案 1、jsonp 2、前端代理 3、后端解决 4、Nginx代理 同源策略 说到跨域就不得不提到同源策略&#xff0c;什么是同源策略&#xff1f; 请求的时候拥有相同的 协议 域名 端口 只要有一个不同就属于跨域 解决方案 解决跨域问题一共有四种方式&#xff…

chatgpt赋能python:Python中的Join方法详解:简化拼接字符串的操作

Python中的Join方法详解&#xff1a;简化拼接字符串的操作 在Python编程中&#xff0c;拼接字符串是一项常见的操作。在过去&#xff0c;我们通常使用“”符号来连接多个字符串。但是&#xff0c;这种方法不是很高效&#xff0c;特别是当需要拼接大量字符串时。这时候&#xf…

基于html+css的图展示98

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

python+django+vue学生在线选课系统93pul

随着信息化时代的到来&#xff0c;网络系统都趋向于智能化、系统化&#xff0c;选课系统也不例外&#xff0c;但目前国内的有些学校仍都使用人工管理&#xff0c;学校规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;…

初识Spring -- Spring入门保姆级教程(一)

文章目录 前言一、Spring是什么&#xff1f;1.概述2.了解spring家族3.spring系统概述4.spring优点5.spring学习路线 二、入门spring1.核心概念2.IOC入门案例3.DI入门案例4.bean的配置5.spring 中 bean的实例化--构造方法6.bean的实例化 -- 静态工厂实例化7.bean实例化--实例工厂…

IEEE802.3和IEEE802.11的分类(仅为分类)

IEEE802.3标准 IEEE802.3:10兆以太网 ●10Base&#xff0d;5 使用粗同轴电缆&#xff0c;最大网段长度为500m&#xff0c;基带传输方法&#xff1b; ●10Base&#xff0d;2 使用细同轴电缆&#xff0c;最大网段长度为185m&#xff0c;基带传输方法&#xff1b; ●10Base&am…

python+vue宠物用品商城网站django宠物领养系统31e70

我们也变得越来越忙碌、对生活的要求也变得更加严格&#xff0c;对快速和方便的服务的需求也在逐渐增加。因此&#xff0c;对宠物行业的管理、服务的要求也越来越严格。为适应时代的发展&#xff0c;各大宠物店开始广泛地使用电脑来进行管理&#xff0c;并推出在线宠物管理系统…

华为OD机试真题B卷 Java 实现【去除多余空格】,附详细解题思路

一、题目描述 去除文本多余空格&#xff0c;但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标&#xff0c;去除多余空格后刷新关键词的起始和结束下标。 条件约束&#xff1a; 不考虑关键词起始和结束位置为空格的场景&#xff1b;单词的的开始和结束下标保证…

100天精通Python(可视化篇)——第89天:Bokeh库绘图可视化基础入门(参数说明+案例实战)

文章目录 专栏导读一、Bokeh是什么&#xff1f;二、安装与导入三、Bokeh接口介绍四、创建图表五、添加自定义渲染器切换主题添加图例图例位置图例方向图例背景和边界图例文本的外观行列布局网格布局 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通Python从入门到…

十万个C语言冷知识

1.printf返回值&#xff1a; 成功&#xff1a;返回打印字符的个数 失败&#xff1a;返回EOF&#xff0c;EOF是文件结束的标志&#xff0c;宏定义为-1 #include <stdio.h> int main() {char str[] "123456789";printf("%d\n", printf("%d\n&quo…

效率神器AutoHotKey的初步使用

文章目录 下载安装与体验快捷键在程序中的热键热字串和重映射实战 Python命令行 下载安装与体验 下载AHK&#xff0c;安装后&#xff0c;右键->新建->AutoHotkey脚本&#xff0c;内容为 #space::Run tinycool.blog.csdn.net其中&#xff0c;#表示Win键&#xff1b;#spa…

Rust每日一练(Leetday0014) 组合总和II、缺失正数、接雨水

目录 40. 组合总和 II Combination Sum II &#x1f31f;&#x1f31f; 41. 缺失的第一个正数 First Missing Positive &#x1f31f;&#x1f31f;&#x1f31f; 42. 接雨水 Trapping Rain Water &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题…

Web 自动化测试案例(入门级)——关闭某视频网站弹出广告以及打开登录框输入内容

文章目录 &#x1f4cb;前言&#x1f3af;自动化测试&#x1f9e9;环境的搭建 &#x1f3af;案例介绍&#x1f4dd;最后 &#x1f4cb;前言 人生苦短&#xff0c;我用Python。许久没写博客了&#xff0c;今天又是久违的参与话题的讨论&#xff0c;话题的内容是&#xff1a;如何…