摘要:// 无需显式类声明void main { IO.println("Hello, JDK 25!"); // java.lang.IO 自动导入 String name = IO.readLine("Enter your name: "); IO.printl
从 Oracle 官网可以看出,最新发布的 Java 25 为长期支持版,并会维护到 2033 年 9 月:
那问题来了,java 25 都有哪些新特性呢?是否值得升级呢?接下来,我们一起来看。
简化 Java 程序入口,支持无类声明的 void main 方法,无需 public static 修饰符。
// 无需显式类声明void main { IO.println("Hello, JDK 25!"); // java.lang.IO 自动导入 String name = IO.readLine("Enter your name: "); IO.println("Hello, " + name);}import java.util.Scanner;public class Main { public static void main(String args) { System.out.println("Hello, JDK 8!"); Scanner scanner = new Scanner(System.in); System.out.print("Enter your name: "); String name = scanner.nextLine; System.out.println("Hello, " + name); }}大幅降低 Java 学习门槛,适合脚本编写和快速原型开发,让初学者能更轻松地编写第一个程序。
允许在 super 或 this 调用前执行初始化逻辑(如参数校验)。
class User { private final int age; User(int age) { // 初始化前置 if (age 67) throw new IllegalArgumentexception("Age must be between 18 and 67"); super; // super 调用可不再强制首行 }}class User { private final int age; User(int age) { super; // 必须为第一行 // 前置初始化逻辑需移到 super 之后 if (age 67) { throw new IllegalArgumentException("Age must be between 18 and 67"); } this.age = age; // 显式赋值 }}import module java.util; // 导入 java.util 模块的所有公共类// 可直接使用 List、ArrayList 等,无需单独导入void main { Listlist = new ArrayList;}import java.util.List; // 显式导入单个类import java.util.ArrayList; // 显式导入另一个类public class Main { public static void main(String args) { Listlist = new ArrayList; System.out.println(list); }}减少冗余的导入语句,提升模块化代码的可读性和编写效率,尤其在依赖多模块时非常有用。
在 switch 和 instanceof 中直接匹配原始类型,如 int、boolean 等。
static void test(Object obj) { if (obj instanceof int i) { // 直接匹配 int 类型 System.out.println("It's an int: " + i); }}static void test(Object obj) { if (obj instanceof Integer) { // 检查是否为 Integer 包装类型 int i = (int) obj; // 显式拆箱 System.out.println("It's an int: " + i); }}早期版本 instanceof 仅支持引用类型(如 Integer、String),需依赖装箱/拆箱(Integer → int)。
统一原始类型与引用类型的模式匹配,简化类型判断逻辑,减少样板代码。
允许在线程内和跨线程共享不可变数据,旨在替代 ThreadLocal,优化虚拟线程不可变信息的传递。
import java.lang.ScopedValue;public class ScopedValueExample { private static final ScopedValueUSER_ID = ScopedValue.newInstance; public static void main(String args) throws Exception { ScopedValue.where(USER_ID, "user123").run( -> { System.out.println("Current user: " + USER_ID.get); }); }}不可变性保证线程安全,内存占用比 ThreadLocal 低约 40%,生命周期自动绑定,无内存泄漏风险,尤其适合虚拟线程场景。
try (var scope = StructuredTaskScope.userTask = scope.fork( -> fetchUser); SubtaskorderTask = scope.fork( -> fetchOrder); scope.join; // 等待所有子任务完成或任一失败 if (userTask.state == Subtask.State.SUCCESS) { return new Response(userTask.get, orderTask.get); } else { throw new RuntimeException("Subtask failed", userTask.exception); }}显著减少内存占用(小型对象最多可节省 33%),提升执行效率(CPU 时间减少,GC 频率降低)。测试显示堆占用减少 22%,CPU 时间减少 8%,GC 次数减少 15%。无需修改代码即可受益,对微服务、云环境等内存受限场景尤其有利。
针对新生代和老年代采用差异化回收策略,停顿时间降低高达 40%,适合高吞吐应用。
引入一些列加密工具类,实现信息加密,例如引入基于晶格密码的 ML-KEM(密钥封装)和 ML-DSA(数字签名)算法,实现代码如下:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("ML-DSA");KeyPair kp = kpg.generateKeyPair;Signature sig = Signature.getInstance("ML-DSA");sig.initSign(kp.getPrivate);sig.update(message);byte signature = sig.sign;// 验证签名sig.initVerify(kp.getPublic);sig.update(message);boolean verified = sig.verify(signature);JDK 25 作为最新的 LTS 版本,通过一系列新特性在开发效率(实例主方法、模块导入声明)、代码质量与可维护性(灵活构造函数体、结构化并发)、性能(紧凑对象头、Shenandoah 分代 GC)和安全性(抗量子加密、PEM API)等方面带来了显著提升。
对于新项目,可以考虑直接采用 JDK 25 LTS。对于现有项目,升级前务必进行充分测试。注意:Java25 移除对 32 位 x86 平台的支持,确保运行环境为 64 位。
希望这些信息能帮助你更好地理解和利用 JDK 25 的新特性!
本文已收录到我的面试小站 [www.javacn.site](https://www.javacn.site),其中包含的内容有:场景题、SpringAI、SpringAIAlibaba、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列、Dify、Coze、AI常见面试题等。
来源:磊哥聊编程