大家好,我是晓凡。

各位 Java 开发者们!是不是还在为 Java 23 的新特性忙得焦头烂额?

别急,Java 24 已经悄咪咪地发布了!

这可是自 Java 21 以来的第三个非长期支持版本,而且这次的新特性数量直接拉满,一共有 24 个,是 Java 22 和 Java 23 的总和!

这么多新特性,学得废么?别怕,这就带大家来一探究竟,看看 Java 24 到底给我们带来了哪些“惊喜”。

一、Java 版本的江湖现状

在深入 Java 24 的新特性之前,我们先来瞅瞅 Java 各个版本的使用占比情况。

距离Java8版本已经过去了很久,但是不少小伙伴还坚守在Java8战场。凭借其稳定性和丰富的类库,在实际开发中依然占据着重要地位。

网友:“你发任你发,我用Java8!”。

根据最新的统计数据(不一定准确~),目前 Java 17 作为长期支持版本(LTS),占据了市场的半壁江山,约有 50% 的开发者在使用。

Java 11 也还有一批忠实的粉丝,占比约 30%。

而像 Java 22、Java 23 这些非长期支持版本,虽然更新频繁,但由于生命周期较短,使用占比相对较低,加起来也就 20% 左右。

不过,随着 Java 25 预计在今年 9 月份发布,作为下一个长期支持版本,相信又会掀起一波升级热潮。

二、Java 24 的新特性大揭秘

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

先来说说这个密钥派生函数 API。在以前,我们开发加密相关的功能时,密钥管理一直是个让人头疼的问题。要是密钥重复使用,那可就容易被黑客钻空子了。Java 24 给我们带来了解决方案,通过这个 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 对象进行其他密钥派生操作

2.2 JEP 483:提前类加载和链接

这个特性简直就是启动时间敏感应用的救星!

在传统的 JVM 中,每次启动应用都要动态加载和链接类,这对于微服务或者无服务器函数来说,简直就是噩梦,启动时间长得让人抓狂。

Java 24 通过缓存已加载和链接的类,直接减少了重复工作的开销,让大型应用的启动时间减少了 40% 以上。

而且,这个优化完全不需要我们修改应用程序、库或框架的代码,只需要添加一个 JVM 参数 -XX:+ClassDataSharing 就搞定了。

2.3 JEP 484:类文件 API

这个特性对于那些喜欢折腾 Java 类文件的开发者来说,简直就是福音。

以前我们处理类文件,还得依赖第三方库,比如 ASM。

现在 Java 24 给我们提供了一套标准化的 API,可以轻松地解析、生成和转换 Java 类文件。

这样一来,我们就可以更加方便地进行字节码操作,提升开发效率。

代码示例:

// 创建一个 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);
}
}
});

2.4 JEP 485:流收集器

流收集器 Stream::gather(Gatherer) 是 Java 24 中一个非常强大的新特性。它允许我们定义自定义的中间操作,从而实现更复杂、更灵活的数据转换。

与现有的 filtermapdistinct 等内置操作不同,Stream::gather 可以帮助我们完成那些难以用标准 Stream 操作完成的任务,比如滑动窗口、自定义规则的去重等。

这简直就是数据处理的瑞士军刀,大大扩展了 Stream API 的应用范围。

代码示例:

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]

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

这个特性可能会让一些老派的 Java 开发者感到不习惯。

Java 24 不再允许启用 Security Manager,即使通过 java -Djava.security.manager 命令也无法启用。

虽然 Security Manager 曾经是 Java 中限制代码权限的重要工具,但由于它复杂性高、使用率低且维护成本大,Java 社区决定最终移除它。

这也意味着我们在开发过程中需要寻找新的安全策略来替代它。

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

作用域值这个特性听起来有点高大上,其实它的作用非常实用。

它可以在线程内和线程间共享不可变的数据,比线程局部变量好多了,尤其是在使用大量虚拟线程时。

这样一来,我们就可以在大型程序中的组件之间安全有效地共享数据,而不用再通过方法参数传递,代码更加简洁清晰。

代码示例:

final static ScopedValue<...> V = new ScopedValue<>();
// 在某个方法中
ScopedValue.where(V, <value>)
.run(() -> { ... V.get() ... call methods ... });
// 在被 lambda 表达式直接或间接调用的方法中
... V.get() ...

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

这个特性对于提升应用程序的并发能力非常有帮助。

在 Java 24 中,虚拟线程在 synchronized 方法和代码块中阻塞时,通常能够释放其占用的操作系统线程,避免了对平台线程的长时间占用。

这样一来,即使在 synchronized 块中发生阻塞,也不会固定平台线程,从而允许平台线程继续服务于其他虚拟线程,提高整体的并发性能。

这对于 I/O 密集型的应用程序来说,简直就是如虎添翼。

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

这个特性主要是为了减少 JDK 的安装体积。默认情况下,JDK 同时包含运行时镜像和 JMOD 文件。

现在,通过这个特性,jlink 工具无需使用 JDK 的 JMOD 文件就可以创建自定义运行时镜像,直接减少了约 25% 的 JDK 安装体积。

这对于那些需要在资源受限的环境中部署 Java 应用的开发者来说,简直就是福音。

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

这个特性主要针对 Java 初学者。

传统的 main 方法声明对于初学者来说,引入了太多的 Java 语法概念,不利于快速上手。

Java 24 对 main 方法的声明进行了简化,让初学者能够更快地入门。

代码示例:

没有使用该特性之前:

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

使用该新特性之后:

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

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

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

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

Java 24 还引入了支持实施抗量子的基于模块晶格的数字签名算法(ML-DSA)。

这是为了应对未来量子计算机可能带来的威胁,提前做好准备。

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

这个特性让我们在安全性方面又多了一层保障。

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

这个特性主要是为了提醒开发者,sun.misc.Unsafe 中的内存访问方法已经在 JDK 23 中被提议弃用,并且在未来的版本中会被移除。

在 Java 24 中,当首次调用 sun.misc.Unsafe 的任何内存访问方法时,运行时会发出警告。

同时,Java 也提供了安全高效的替代方案,比如 java.lang.invoke.VarHandlejava.lang.foreign.MemorySegment

让我们可以更加安全地进行内存操作。

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

结构化并发是 Java 19 引入的一个多线程编程方法,目的是通过结构化并发 API 来简化多线程编程。

在 Java 24 中,这个特性继续得到完善。

它将不同线程中运行的多个任务视为单个工作单元,从而简化错误处理、提高可靠性并增强可观察性。

这对于虚拟线程来说,简直就是绝配。虚拟线程是 JDK 实现的轻量级线程,许多虚拟线程共享同一个操作系统线程,从而允许非常多的虚拟线程。

代码示例:

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

小结

Java 24 的发布,无疑给 Java 开发者们带来了新的挑战。

这么多的新特性,在开发过中也有了更多的选择和更强大的工具。

小伙伴:“学习进度跟不上版本更新的脚步,学不动了,要学废了~”

但从长远来看,这将有助于我们提升开发效率、优化代码质量和提升应用性能。

各位小伙伴们,你对此有什么看法呢? 欢迎评论区留言~

Java24你发任你发,我用Java8的更多相关文章

  1. C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

    前面介绍了很多篇关于使用C#开发微信门户及应用的文章,基本上把当时微信能做的接口都封装差不多了,微信框架也积累了不少模块和用户,最近发现微信公众平台增加了不少内容,特别是在自定义菜单里面增加了扫一扫. ...

  2. 微信公众平台自定义菜单新增扫一扫、发图片、发位置 LBS运作更便捷

    今天微信公众平台发布更新,自定义菜单新增扫一扫.发图片.发送位置等功能,这对于有意挖掘微信LBS服务的运营者来说更便捷了,订阅号不用返回微信界面就能扫图.发送图片.调用地理位置,用户体验更友好,自然也 ...

  3. iOS中打电话、打开网址、发邮件、发短信等

    常用小功能 小功能简介 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话-方法1 最简单最直接的方式:直接跳到拨号界面 NSURL *url = [ ...

  4. AJ学IOS(45)之常用的小功能比如打电话、打开网址、发邮件、发短信打开其他应用。

    AJ分享,必须精品 简介 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信.打开其他应用等. 打电话 方法1 最简单最直接的方式:直接跳到拨号界面 NSURL ...

  5. arti车是大幅度发地方大幅度发

    转: arti车是大幅度发地方大幅度发 arti车是大幅度发地方大幅度发 转: arti车是大幅度发地方大幅度发

  6. [opencv]白平衡算法中的灰度世界法,改善图像发红发蓝发绿的现象

    #include<iostream> #include <opencv2/opencv.hpp> #include <math.h> using namespace ...

  7. 打电话,发短信,发邮件,app跳转

    1.打电话 - (IBAction)callPhone1:(id)sender { NSURL *url = [NSURL URLWithString:@"tel://18500441739 ...

  8. a链接 打电话 发短信 发email

    <a href="tel:10086">给10086打电话</a><a href="sms:10086">给10086发短信 ...

  9. 发送邮件的几种方法(C#发邮件 和 js前台实现都有)C#后台自动发邮件 js发邮件

    1.后台自动发邮件 1)首先设置邮件参数,这里写在configuration里面 <appSettings> <add key="SMTP" value=&quo ...

  10. iOS打电话、发邮件、发短信、打开浏览器

    //1.调用 自带mail [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://163@16 ...

随机推荐

  1. Kubernetes系列(一) - kubernetes入门基本概念

    目录 1. 基本概念 1.1 什么是 Kubernetes 集群 1.2 Kubernetes集群资源组成: 1.3 无状态和有状态的区别 1.3.1 无状态服务 1.3.2 有状态服务 2. Kub ...

  2. TestProject 使用汇总

    1. 截图 from addons.screenshot_utils import ScreenshotUtils step_output = driver.addons().execute( Scr ...

  3. 安装Rational rose软件简单教程

    安装Rational rose软件简单教程 一.下载文件 百度云盘下载链接:https://pan.baidu.com/s/1QWmTgxKlQtE5flP7dXIF5w 提取码:wjnq 二.装虚拟 ...

  4. ABC 386 (A~F)

    赛时做的,结果一直在卡D题.打得很失败的一场. ABC 略. D 题意可以转化为:给定\(m\)个黑色或白色的格子,其中: 每个黑色格子和\((1,1)\)作为对角线顶点,构成一个黑色矩形 每个白色格 ...

  5. Docker npm install:npm ERR! code UNABLE_TO_GET_ISSUER_CERT_LOCALLY 。。reason: unable to get local issuer certificate 解决办法

    这个是需要证书导致无法连接,临时解决办法是设置 npm set strict-ssl=false 在 Dockerfile文件里的  RUN npm install 之前添加 RUN npm set ...

  6. 把.netcore console 安装到Windows 系统服务。

    用个工具:NSSM 下载:最新的那个pre版本 http://www.nssm.cc/download 测试.netcore 的一个控制台程序(Console),仅仅用来定时写入一些日志, 代码如下: ...

  7. MySQL 中information_schema、mysql、performance_schema、sys 简介

    一.information_schema简介在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信息. ...

  8. 第11章 其他 XML 技术

    第11章 其他 XML 技术 概述 System.Xml 命名空间由以下命名空间和核心类型构成: ​System.Xml.*​ ​XmlReader​ 和 XmlWriter​:高性能.前向读写的 X ...

  9. Flink同步kafka到iceberg数据延迟,两个checkpoint后才可查询

    一.问题描述 用户配置了高级参数很多,观察kafka增量数据不多,flink负载不高情况下两个checkpoint后才可查询到数据.   排查时hdfs有数据文件产生,但是mainfast文件中最新快 ...

  10. Luogu P9646 SNCPC2019 Paper-cutting 题解 [ 紫 ] [ manacher ] [ 贪心 ] [ 哈希 ] [ BFS ]

    Paper-cutting:思维很好,但代码很构式的 manacher 题. 蒟蒻 2025 年切的第一道题,是个紫,并且基本独立想出的,特此纪念. 判断能否折叠 我们先考虑一部分能折叠需要满足什么条 ...