JDK 21新特性全面解析

Java Development Kit (JDK) 21作为Oracle长期支持(LTS)版本,于2023年9月正式发布,带来了多项令人振奋的新特性和改进。本文将全面介绍JDK 21中的主要更新,帮助开发者了解如何利用这些新功能提升开发效率和代码质量。

一、虚拟线程(Virtual Threads)正式发布

虚拟线程是JDK 21中最引人注目的特性之一,它从预览阶段(JDK 19和20)正式转正。

// 创建虚拟线程的简单示例
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 10_000).forEach(i -> {executor.submit(() -> {Thread.sleep(Duration.ofSeconds(1));return i;});});
}

核心优势:

  • 轻量级线程,可创建数百万个而不会耗尽系统资源
  • 简化高吞吐量并发应用程序的编写
  • 与现有Java代码无缝兼容,使用相同的Thread API
  • 显著减少编写、维护和观察高吞吐量并发应用程序的工作量

二、序列集合(Sequenced Collections)

JDK 21引入了一套新的接口来表示具有定义顺序的集合:

interface SequencedCollection<E> extends Collection<E> {// 新增方法SequencedCollection<E> reversed();void addFirst(E);void addLast(E);E getFirst();E getLast();E removeFirst();E removeLast();
}

具体实现:

  • SequencedCollection - 有序集合(如List)
  • SequencedSet - 有序且不重复的集合(如LinkedHashSet)
  • SequencedMap - 有序映射(如LinkedHashMap)

使用示例:

List<Integer> list = new ArrayList<>(List.of(1, 2, 3));// 新方法
list.getFirst(); // 1
list.getLast();  // 3var reversed = list.reversed(); // [3, 2, 1]

三、分代ZGC(Generational ZGC)

JDK 21对Z垃圾收集器进行了重大改进,引入了分代收集:

主要改进:

  • 通过区分年轻代和老年代对象提高垃圾收集效率
  • 减少垃圾收集的开销,特别是对于分配率高的应用程序
  • 保持ZGC的低延迟特性(暂停时间通常小于1毫秒)
  • 可通过-XX:+ZGenerational标志启用

四、模式匹配的增强

1. 记录模式(Record Patterns)正式发布

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

2. 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();};
}

五、字符串模板(预览特性)

JDK 21引入了字符串模板(预览),简化字符串插值和复杂字符串的构建:

String name = "Joan";
String info = STR."My name is \{name}";
// 结果: "My name is Joan"// 复杂示例
String title = "My Web Page";
String text  = "Hello, world";
String html = STR."""<html><head><title>\{title}</title></head><body><p>\{text}</p></body></html>""";

六、外部函数与内存API(正式发布)

替代JNI的更安全、更高效的方式:

// 1. 在Java代码中链接到C库函数
Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle strlen = linker.downcallHandle(stdlib.lookup("strlen").get(),FunctionDescriptor.of(JAVA_LONG, ADDRESS)
);// 2. 使用try-with-resources管理原生内存
try (Arena arena = Arena.ofConfined()) {MemorySegment str = arena.allocateUtf8String("Hello");long len = (long) strlen.invoke(str);System.out.println(len); // 5
}

七、未命名模式和变量(预览)

简化模式匹配并减少不必要的变量命名:

// 旧方式
if (obj instanceof Point p) {System.out.println(p.x());
}// 新方式 - 不需要命名变量
if (obj instanceof Point(_, int y)) {System.out.println("y=" + y);
}// 未命名变量示例
try {int res = calculate();
} catch (Exception _) {  // 忽略异常细节System.out.println("计算出错");
}

八、未命名类和实例main方法(预览)

简化入门程序编写:

// 传统方式
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
}// 新方式(预览)
void main() {System.out.println("Hello, World!");
}

九、作用域值(Scoped Values)预览

替代线程局部变量的更好选择:

final static ScopedValue<...> V = ScopedValue.newInstance();// 在作用域内设置值
ScopedValue.where(V, <value>).run(() -> { ... V.get() ... });

优势:

  • 不可变,更安全
  • 生命周期有限,仅限于动态范围
  • 子线程自动继承

十、其他重要改进

  1. 密钥封装机制API:用于安全密钥交换的加密功能
  2. 准备禁止动态加载代理:为未来版本默认禁止动态加载代理做准备
  3. 性能改进:包括G1垃圾收集器的优化和向量API的增强
  4. Linux/RISC-V移植:正式支持RISC-V架构

总结

JDK 21作为长期支持版本,为Java开发者带来了众多强大的新特性和改进。从革命性的虚拟线程到实用的序列集合,从模式匹配的增强到字符串模板的引入,这些特性共同推动Java平台向前迈进了一大步。

对于开发者而言,现在是时候开始探索这些新特性,评估它们如何能够提升现有应用程序的性能和开发效率。特别是虚拟线程和分代ZGC等特性,有望显著改善高并发应用程序的性能和可维护性。

随着Java的持续演进,JDK 21再次证明了Java平台在现代软件开发中的活力和创新精神。

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

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

相关文章

如何选择高性价比的 1T 服务器租用服务​

选择高性价比的 1T 服务器租用服务​&#xff0c;可参考以下内容&#xff1a; 1、根据需求选配置​ 明确自身业务需求是关键。若为小型网站或轻量级应用&#xff0c;数据存储与处理需求不高&#xff0c;选择基础配置服务器即可。如个人博客网站&#xff0c;普通的 Intel Xeon …

JavaScript性能优化实战(11):前沿技术在性能优化中的应用

引言 随着Web应用复杂度和性能需求不断提高,传统的JavaScript优化技术已经无法满足某些高性能计算场景的需求。本文将深入探讨前沿Web技术如何突破JavaScript的性能瓶颈,为Web应用提供接近原生应用的性能体验。从底层计算到图形渲染,从并发处理到动画优化,我们将通过实际案…

package.json 和 package-lock.json 的区别

package.json​​ ​​作用​​ ​​声明项目元数据​​&#xff1a;如项目名称、版本、描述、入口文件等。​​定义依赖范围​​&#xff1a;在 dependencies 和 devDependencies 中声明项目​​直接依赖​​的包及其​​版本范围​​&#xff08;如 ^1.2.3&#xff09;。​​…

Rollup入门与进阶:为现代Web应用构建超小的打包文件

我们常常面临Webpack复杂配置或是Babel转译后的冗余代码&#xff0c;结果导致最终的包体积居高不下加载速度也变得异常缓慢&#xff0c;而在众多打包工具中Rollup作为一个轻量且高效的选择&#xff0c;正悄然改变着这一切&#xff0c;本文将带你深入了解这个令人惊艳的打包工具…

基于C#的MQTT通信实战:从EMQX搭建到发布订阅全解析

MQTT(Message Queueing Telemetry Transport) 消息队列遥测传输&#xff0c;在物联网领域应用的很广泛&#xff0c;它是基于Publish/Subscribe模式&#xff0c;具有简单易用&#xff0c;支持QoS&#xff0c;传输效率高的特点。 它被设计用于低带宽&#xff0c;不稳定或高延迟的…

Mysql数据库之集群进阶

一、日志管理 5.7版本自定义路径时的文件需要自己提前创建好文件&#xff0c;不会自动创建&#xff0c;否则启动mysql会报错 错误日志 rpm包(yum) /var/log/mysql.log 默认错误日志 ###查询日志路径 [rootdb01 ~]# mysqladmin -uroot -pEgon123 variables | grep -w log_e…

当硅基存在成为人性延伸的注脚:论情感科技重构社会联结的可能性

在东京大学机器人实验室的档案室里&#xff0c;保存着一份泛黄的二战时期设计图——1943年日本陆军省秘密研发的“慰安妇替代品”草图。这个诞生于战争阴霾的金属躯体&#xff0c;与2025年上海进博会上展出的MetaBox AI伴侣形成时空对话&#xff1a;当人类将情感需求投射于硅基…

5月17日

这几天不知道为啥没更新。可能是玩得太疯了。或者是考试有点集中&#xff1f;&#xff1f; 线性代数开课了&#xff0c;英语昨天完成了debate 昨天中午debate结束我们就出去玩了&#xff0c;去的那里时光民俗&#xff0c;别墅很好&#xff0c;770平米&#xff0c;但是缺点是可…

FIFO的应用案例(基于Zephyr OS )

目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 FIFO的函数接口 3 FIFO的应用函数实现 3.1 实现步骤 3.2 代码设计 3.3 测试代码实现 3.4 源代码文件 4 编译和测试 4.1 编译代码 4.2 测试 概述 本文介绍了在nRF52832开发板上使用Zephyr操作系统进行…

AWS Elastic Beanstalk部署极简Spring工程(EB CLI失败版)

弃用 这里我没有走通EB CLI方式部署。 问题 最近又加入了AWS项目组&#xff0c;又要再次在AWS云上面部署Spring服务&#xff0c;我这里使用的使用AWS中国云。需要使用AWS Elastic Beanstalk部署一个极简Spring工程。 EB CLI安装 安装EB CLI之前需要先在本地安装好Git&…

粒子群算法(PSO算法)

粒子群算法概述 1.粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;。粒子群优化算法是在1995年由Kennedy博士和Eberhart博士一起提出的&#xff0c;它源于对鸟群捕食行为的研究。 2.基本核心是利用群体中的个体对信息的共享从而使得整…

leetcode2934. 最大化数组末位元素的最少操作次数-medium

1 题目&#xff1a;最大化数组末位元素的最少操作次数 官方标定难度&#xff1a;中 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;这两个数组的长度都是 n 。 你可以执行一系列 操作&#xff08;可能不执行&#xff09;。 在每次操作中&#xff0c;你可以选…

Elasticsearch 官网阅读之 Term-level Queries

Term-level Queries 参考&#xff1a;https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-exists-query 一、Term Query Term Query 是 term 精准查询。需要注意的是&#xff0c;在进行 Term Query 的时候&#xff0c;要避免 text 类型的字段&#x…

信贷域——互联网金融业务

摘要 本文深入探讨了信贷域全托与半托业务的定义、特点、适用场景及注意事项&#xff0c;并分析了互联网金融核心信息流的多个方面&#xff0c;包括资金流、信息流、风险流、合规流、物流、技术流和商流&#xff0c;还阐述了金融系统“断直连”业务的相关内容&#xff0c;以及…

科技晚报 AI 速递:今日科技热点一览 丨 2025 年 5 月 17 日

科技晚报AI速递:今日科技热点一览 丨2025年5月17日 我们为您汇总今日的科技领域最新动向&#xff0c;带您快速了解前沿技术、突破性研究及行业趋势。 黄仁勋劝特朗普&#xff1a;AI 芯片出口规则得改&#xff0c;中国紧追其后&#xff1a;英伟达 CEO 黄仁勋在华盛顿 “山与谷论…

使用streamlit实现vLLM多实例信息统一监控

本文代码和配置文件实现了一个基于 Streamlit 和 FastAPI 的前后端分离的应用程序&#xff0c;用于管理和展示 VLLM&#xff08;Very Large Language Model&#xff09;实例的信息。以下是代码和配置文件的总结摘要&#xff1a; 概要 功能概述 前后端启动方式&#xff1a; 使用…

搭建一个WordPress网站需要多少成本

WordPress 最初可能只是一个简单的博客平台。但近年来&#xff0c;它不仅成为了最好的博客平台&#xff0c;还成为了一个全面的内容管理系统。白宫、jQuery、NGINX、《纽约时报》等企业都把 WordPress 作为自己的网上家园。 不过&#xff0c;它们只是其中的佼佼者。根据 Built…

飞帆控件 post or get it when it has get

我在这里分享两个链接&#xff1a; post_get_it 设计 - 飞帆 有人看出来这个控件是干什么用吗&#xff1f; 控件的配置&#xff1a;

AI智能体 | 使用Coze一键制作“假如书籍会说话”视频,18个作品狂吸17.6万粉,读书博主新标杆!(附保姆级教程)

目录 一、整体工作流设计 二、制作工作流 2.1 开始节点 2.2 大模型_生成对话文案 2.3 代码_字幕切割 2.4 画板_对话背景 2.5 循环_对话语音01 2.5.1 选择器_2 2.5.2 语音合成02 2.5.3 语音合成03 2.5.4 变量聚合_1 2.5.5 视频合成01 2.6 循环_3 2.6.1 选择器_3 …

mysql中4种扫描方式和聚簇索引非聚簇索引【爽文一篇】

目录 一 mysql的聚簇索引&非聚簇索引 1.1 数据表 1.2 聚簇索引 1.3 非聚簇索引 1.4 覆盖索引 二 mysql的4种扫描查询 2.1 全表扫描 2.2 索引扫描 2.3 覆盖索引扫描 2.4 回表扫描 2.5 总结 三 mysql的回表查询详解 3.1 回表查询 一 mysql的聚簇索引&非聚簇…