JDK 24 发布,新特性解读!

真快啊!Java 24 这两天已经正式发布啦!这是自 Java 21 以来的第三个非长期支持版本,和 Java 22、Java 23一样。

下一个长期支持版是 Java 25,预计今年 9 月份发布。

Java 24 带来的新特性还是蛮多的,一共 24 个。Java 23 和 Java 23 都只有 12 个,Java 24的新特性相当于这两次的总和了。因此,这个版本还是非常有必要了解一下的。

下图是从 JDK8 到 JDK 24 每个版本的更新带来的新特性数量和更新时间:

我在昨天晚上详细看了一下 Java 24 的详细更新,并对其中比较重要的新特性做了详细的解读,希望对你有帮助!

本文内容概览

JEP 478: 密钥派生函数 API(预览)

密钥派生函数 API 是一种用于从初始密钥和其他数据派生额外密钥的加密算法。它的核心作用是为不同的加密目的(如加密、认证等)生成多个不同的密钥,避免密钥重复使用带来的安全隐患。 这在现代加密中是一个重要的里程碑,为后续新兴的量子计算环境打下了基础

通过该 API,开发者可以使用最新的密钥派生算法(如 HKDF 和未来的 Argon2):

// 创建一个 KDF 对象,使用 HKDF-SHA256 算法
KDF hkdf = KDF.getInstance("HKDF-SHA256"); // 创建 Extract 和 Expand 参数规范
AlgorithmParameterSpec params =HKDFParameterSpec.ofExtract().addIKM(initialKeyMaterial) // 设置初始密钥材料.addSalt(salt)             // 设置盐值.thenExpand(info, 32);     // 设置扩展信息和目标长度// 派生一个 32 字节的 AES 密钥
SecretKey key = hkdf.deriveKey("AES", params);// 可以使用相同的 KDF 对象进行其他密钥派生操作

JEP 483: 提前类加载和链接

在传统 JVM 中,应用在每次启动时需要动态加载和链接类。这种机制对启动时间敏感的应用(如微服务或无服务器函数)带来了显著的性能瓶颈。该特性通过缓存已加载和链接的类,显著减少了重复工作的开销,显著减少 Java 应用程序的启动时间。测试表明,对大型应用(如基于 Spring 的服务器应用),启动时间可减少 40% 以上。

这个优化是零侵入性的,对应用程序、库或框架的代码无需任何更改,启动也方式保持一致,仅需添加相关 JVM 参数(如 -XX:+ClassDataSharing)。

JEP 484: 类文件 API

类文件 API 在 JDK 22 进行了第一次预览(JEP 457),在 JDK 23 进行了第二次预览并进一步完善(JEP 466)。最终,该特性在 JDK 24 中顺利转正。

类文件 API 的目标是提供一套标准化的 API,用于解析、生成和转换 Java 类文件,取代过去对第三方库(如 ASM)在类文件处理上的依赖。

// 创建一个 ClassFile 对象,这是操作类文件的入口。
ClassFile cf = ClassFile.of();
// 解析字节数组为 ClassModel
ClassModel classModel = cf.parse(bytes);// 构建新的类文件,移除以 "debug" 开头的所有方法
byte[] newBytes = cf.build(classModel.thisClass().asSymbol(),classBuilder -> {// 遍历所有类元素for (ClassElement ce : classModel) {// 判断是否为方法 且 方法名以 "debug" 开头if (!(ce instanceof MethodModel mm&& mm.methodName().stringValue().startsWith("debug"))) {// 添加到新的类文件中classBuilder.with(ce);}}});

JEP 485: 流收集器

流收集器 Stream::gather(Gatherer) 是一个强大的新特性,它允许开发者定义自定义的中间操作,从而实现更复杂、更灵活的数据转换。Gatherer 接口是该特性的核心,它定义了如何从流中收集元素,维护中间状态,并在处理过程中生成结果。

与现有的 filtermapdistinct 等内置操作不同,Stream::gather 使得开发者能够实现那些难以用标准 Stream 操作完成的任务。例如,可以使用 Stream::gather 实现滑动窗口、自定义规则的去重、或者更复杂的状态转换和聚合。 这种灵活性极大地扩展了 Stream API 的应用范围,使开发者能够应对更复杂的数据处理场景。

基于 Stream::gather(Gatherer) 实现字符串长度的去重逻辑:

var result = Stream.of("foo", "bar", "baz", "quux").gather(Gatherer.ofSequential(HashSet::new, // 初始化状态为 HashSet,用于保存已经遇到过的字符串长度(set, str, downstream) -> {if (set.add(str.length())) {return downstream.push(str);}return true; // 继续处理流})).toList();// 转换为列表// 输出结果 ==> [foo, quux]

JEP 486: 永久禁用安全管理器

JDK 24 不再允许启用 Security Manager,即使通过 java -Djava.security.manager命令也无法启用,这是逐步移除该功能的关键一步。虽然 Security Manager 曾经是 Java 中限制代码权限(如访问文件系统或网络、读取或写入敏感文件、执行系统命令)的重要工具,但由于复杂性高、使用率低且维护成本大,Java 社区决定最终移除它。

JEP 487: 作用域值 (第四次预览)

作用域值(Scoped Values)可以在线程内和线程间共享不可变的数据,优于线程局部变量,尤其是在使用大量虚拟线程时。

final static ScopedValue<...> V = new ScopedValue<>();// In some method
ScopedValue.where(V, <value>).run(() -> { ... V.get() ... call methods ... });// In a method called directly or indirectly from the lambda expression
... V.get() ...

作用域值允许在大型程序中的组件之间安全有效地共享数据,而无需求助于方法参数。

JEP 491: 虚拟线程的同步而不固定平台线程

优化了虚拟线程与 synchronized 的工作机制。 虚拟线程在 synchronized 方法和代码块中阻塞时,通常能够释放其占用的操作系统线程(平台线程),避免了对平台线程的长时间占用,从而提升应用程序的并发能力。 这种机制避免了“固定 (Pinning)”——即虚拟线程长时间占用平台线程,阻止其服务于其他虚拟线程的情况。

现有的使用 synchronized 的 Java 代码无需修改即可受益于虚拟线程的扩展能力。 例如,一个 I/O 密集型的应用程序,如果使用传统的平台线程,可能会因为线程阻塞而导致并发能力下降。 而使用虚拟线程,即使在 synchronized 块中发生阻塞,也不会固定平台线程,从而允许平台线程继续服务于其他虚拟线程,提高整体的并发性能。

JEP 493:在没有 JMOD 文件的情况下链接运行时镜像

默认情况下,JDK 同时包含运行时镜像(运行时所需的模块)和 JMOD 文件。这个特性使得 jlink 工具无需使用 JDK 的 JMOD 文件就可以创建自定义运行时镜像,减少了 JDK 的安装体积(约 25%)。

说明:

  • Jlink 是随 Java 9 一起发布的新命令行工具。它允许开发人员为基于模块的 Java 应用程序创建自己的轻量级、定制的 JRE。
  • JMOD 文件是 Java 模块的描述文件,包含了模块的元数据和资源。

JEP 495: 简化的源文件和实例主方法(第四次预览)

这个特性主要简化了 main 方法的的声明。对于 Java 初学者来说,这个 main 方法的声明引入了太多的 Java 语法概念,不利于初学者快速上手。

没有使用该特性之前定义一个 main 方法:

public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
}

使用该新特性之后定义一个 main 方法:

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

进一步简化(未命名的类允许我们省略类名)

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

JEP 497: 量子抗性数字签名算法 (ML-DSA)

JDK 24 引入了支持实施抗量子的基于模块晶格的数字签名算法 (Module-Lattice-Based Digital Signature Algorithm, ML-DSA),为抵御未来量子计算机可能带来的威胁做准备。

ML-DSA 是美国国家标准与技术研究院(NIST)在 FIPS 204 中标准化的量子抗性算法,用于数字签名和身份验证。

JEP 498: 使用 sun.misc.Unsafe 内存访问方法时发出警告

JDK 23(JEP 471) 提议弃用 sun.misc.Unsafe 中的内存访问方法,这些方法将来的版本中会被移除。在 JDK 24 中,当首次调用 sun.misc.Unsafe 的任何内存访问方法时,运行时会发出警告。

这些不安全的方法已有安全高效的替代方案:

  • java.lang.invoke.VarHandle :JDK 9 (JEP 193) 中引入,提供了一种安全有效地操作堆内存的方法,包括对象的字段、类的静态字段以及数组元素。
  • java.lang.foreign.MemorySegment :JDK 22 (JEP 454) 中引入,提供了一种安全有效地访问堆外内存的方法,有时会与 VarHandle 协同工作。

这两个类是 Foreign Function & Memory API(外部函数和内存 API) 的核心组件,分别用于管理和操作堆外内存。Foreign Function & Memory API 在 JDK 22 中正式转正,成为标准特性。

import jdk.incubator.foreign.*;
import java.lang.invoke.VarHandle;// 管理堆外整数数组的类
class OffHeapIntBuffer {// 用于访问整数元素的VarHandleprivate static final VarHandle ELEM_VH = ValueLayout.JAVA_INT.arrayElementVarHandle();// 内存管理器private final Arena arena;// 堆外内存段private final MemorySegment buffer;// 构造函数,分配指定数量的整数空间public OffHeapIntBuffer(long size) {this.arena  = Arena.ofShared();this.buffer = arena.allocate(ValueLayout.JAVA_INT, size);}// 释放内存public void deallocate() {arena.close();}// 以volatile方式设置指定索引的值public void setVolatile(long index, int value) {ELEM_VH.setVolatile(buffer, 0L, index, value);}// 初始化指定范围的元素为0public void initialize(long start, long n) {buffer.asSlice(ValueLayout.JAVA_INT.byteSize() * start,ValueLayout.JAVA_INT.byteSize() * n).fill((byte) 0);}// 将指定范围的元素复制到新数组public int[] copyToNewArray(long start, int n) {return buffer.asSlice(ValueLayout.JAVA_INT.byteSize() * start,ValueLayout.JAVA_INT.byteSize() * n).toArray(ValueLayout.JAVA_INT);}
}

JEP 499: 结构化并发(第四次预览)

JDK 19 引入了结构化并发,一种多线程编程方法,目的是为了通过结构化并发 API 来简化多线程编程,并不是为了取代java.util.concurrent,目前处于孵化器阶段。

结构化并发将不同线程中运行的多个任务视为单个工作单元,从而简化错误处理、提高可靠性并增强可观察性。也就是说,结构化并发保留了单线程代码的可读性、可维护性和可观察性。

结构化并发的基本 API 是StructuredTaskScope,它支持将任务拆分为多个并发子任务,在它们自己的线程中执行,并且子任务必须在主任务继续之前完成。

StructuredTaskScope 的基本用法如下:

    try (var scope = new StructuredTaskScope<Object>()) {// 使用fork方法派生线程来执行子任务Future<Integer> future1 = scope.fork(task1);Future<String> future2 = scope.fork(task2);// 等待线程完成scope.join();// 结果的处理可能包括处理或重新抛出异常... process results/exceptions ...} // close

结构化并发非常适合虚拟线程,虚拟线程是 JDK 实现的轻量级线程。许多虚拟线程共享同一个操作系统线程,从而允许非常多的虚拟线程。

Java 新特性系列解读

如果你想系统了解 Java 8 以及之后版本的新特性,可以在 JavaGuide 上阅读对应的文章:

比较推荐这几篇:

  • Java 11 新特性概览
  • Java 17 新特性概览(重要)
  • Java 21 新特性概览(重要)

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

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

相关文章

解锁实时跌倒检测Jetson Nano与定制的YOLOv8

1. 概述 跌倒是一个重大问题,特别是对老年人和有疾病的人来说,因为它们可能导致严重伤害甚至死亡。坠落探测系统旨在迅速识别此类事件,确保及时提供援助并减少造成严重后果的风险。随着人工智能和机器学习的进步,跌倒检测变得更加准确和可靠。在我之前的博客中,“开始使用…

请求接口,接口响应中带回cookie,再请求其他接口后,cookie没有自动带入

最近做的项目,登陆时内部的登录,做个跳转,在那边登陆后会回跳到本地页面 本地联调接口,回调地址一直是提示跨域,然后再访问其他的接口提示401,未认证状态 从这个大哥中看到的问题,感谢 http://www.janron.net/details/8-computerLanguage-2326-488首先确定后端的接口resp…

Glyphs制作tff字体子集

官网 https://glyphsapp.com/zh 导出字体的子集 开发过程中整个字体文件太大,需要制作部分字体的子集合。 双击tff文件打开字体文件选择要保留的字符 •进入字体编辑窗口后,你会看到所有字符的网格。 •按住 Cmd 键并点击你想要保留的字符。 例如:大小写字母、数字、特殊符号…

开启MySQL8的密码策略组件validate_password.250320

一、validate_password组件安装配置安装组件INSTALL COMPONENT file://component_validate_password;安装后,密码策略立即生效,但仅影响后续操作(如新建用户或修改密码)。卸载组件UNINSTALL COMPONENT file://component_validate_password;卸载后,密码复杂度策略失效,可设…

茶聚场日事清实战案例:OKR目标管理+流程优化+看板会议系统深度应用

茶聚场通过引入日事清管理系统,有效解决了OKR不透明、跨区域协作低效及供应链管理分散等挑战,实现了目标对齐、流程优化与运营效率提升,支撑其在新茶饮市场的战略扩张。公司介绍 在2016年,一个新的品牌诞生在北京的商业心脏地带——茶聚场。作为茶聚场(北京)餐饮管理有限…

20250320日

01.军工 02.纳指etf 03.煤炭:04.红利etf 05.养殖ETF:06.白酒:

勤策、玄瞳、纷享销客对比,消费品领域CRM厂商怎么选?

近年来,随着消费品行业竞争加剧,CRM(客户关系管理)系统已成为企业提升运营效率、增强客户满意度的关键工具。其中,纷享销客、勤策、玄瞳等作为该领域的佼佼者,各自拥有独特的产品特点和适用企业类型。本文将此前三家主流快消领域CRM厂商进行全面对比,帮您理清各家厂商“…

Deepseek本地部署的webui可视化

1.WebUI可视化插件 —— Page Assist 在chrome应用商店中搜索Page Assist,找到后添加到chrome 浏览器添加完成后类似这样 点击这个扩展插件,即可看到 就可以进行对话聊天了

母婴电商企业案例:日事清驱动项目管理执行与OKR目标管理的流程自动化实践

日事清以电商基因与高性价比集成方案,助力科木电商解决协作低效、流程散乱等管理痛点,实现母婴品牌“小鹿豆豆”的团队提效与目标追踪。一、关于科木电商“小鹿豆豆”,一个年轻的品牌,近期在无论是淘宝、拼多多还是抖音电商平台,都成了亮眼的爆品。这个由绵阳科木电子商务…

20241905 2024-2025-2 《网络攻防实践》 第4次作业

1. 实验内容 在网络攻防实验环境中完成TCP/IP协议栈重点协议的攻击实验,包括ARP缓存欺骗攻击、ICMP重定向攻击、SYN Flood攻击、TCP RST攻击、TCP会话劫持攻击。 ARP缓存欺骗攻击:ARP协议在进行IP到MAC地址映射查询时存在安全缺陷,ARP协议为提高效率,设置了缓存机制,会将主…

ClkLog埋点系统客户案例-电子签佼佼者「大家签」为何选择ClkLog?

ClkLog的付费版上线已有一年多。作为一款从开源起步的产品,我们始终关注用户的使用体验。因此,近期我们发起了一轮客户回访,希望了解他们的使用情况及优化建议,并分享一些典型案例,让更多人看到ClkLog在真实业务场景中的价值。本次回访的客户是ClkLog最早的一批付费用户—…

国思RDIF低代码快速开发框架 v6.2版本发布

国思RDIF企业级低代码开发平台,给用户和开发者最佳的框架平台方案,为企业快速构建跨平台、企业级的应用提供强大支持。致力于解决企业信息化项目交付难、实施效率低、开发成本高的问题。能帮助企业快速构建美观易用、架构专业、安全可控的企业级多终端应用,并可随需而变。1、…