找回密码
 立即注册
首页 业界区 业界 重要:Java25正式发布(长期支持版)!

重要:Java25正式发布(长期支持版)!

锑砖 昨天 18:49
从 Oracle 官网可以看出,最新发布的 Java 25 为长期支持版,并会维护到 2033 年 9 月
1.png

https://www.oracle.com/cn/java/technologies/java-se-support-roadmap.html
那问题来了,Java 25 都有哪些新特性呢?是否值得升级呢?接下来,我们一起来看。
视频讲解

https://www.douyin.com/video/7550608463605288255
1.语言特性增强

1.1 简化main方法

简化 Java 程序入口,支持无类声明的 void main() 方法,无需 public static 修饰符。
新版写法
  1. // 无需显式类声明
  2. void main() {
  3.     IO.println("Hello, JDK 25!"); // java.lang.IO 自动导入
  4.     String name = IO.readLine("Enter your name: ");
  5.     IO.println("Hello, " + name);
  6. }
复制代码
老版写法
  1. import java.util.Scanner;
  2. public class Main {
  3.     public static void main(String[] args) {
  4.         System.out.println("Hello, JDK 8!");
  5.         Scanner scanner = new Scanner(System.in);
  6.         System.out.print("Enter your name: ");
  7.         String name = scanner.nextLine();
  8.         System.out.println("Hello, " + name);
  9.     }
  10. }
复制代码
新版优点

大幅降低 Java 学习门槛,适合脚本编写和快速原型开发,让初学者能更轻松地编写第一个程序。
1.2 灵活的构造函数体

允许在 super() 或 this() 调用前执行初始化逻辑(如参数校验)。
新版写法
  1. class User {
  2.     private final int age;
  3.     User(int age) {
  4.         // 初始化前置
  5.         if (age < 18 || age > 67)
  6.             throw new IllegalArgumentException("Age must be between 18 and 67");
  7.         super(); // super() 调用可不再强制首行
  8.     }
  9. }
复制代码
老版写法
  1. class User {
  2.     private final int age;
  3.     User(int age) {
  4.         super(); // 必须为第一行
  5.         // 前置初始化逻辑需移到 super() 之后
  6.         if (age < 18 || age > 67) {
  7.             throw new IllegalArgumentException("Age must be between 18 and 67");
  8.         }
  9.         this.age = age; // 显式赋值
  10.     }
  11. }
复制代码
新版优点

提升代码可读性和灵活性,避免将校验逻辑提取到静态方法的模板代码,增强对象构建时的安全性
1.3 模块一次性导入(预览特性)

允许通过 import module 一次性导入模块的所有公共类。
新版写法
  1. import module java.util; // 导入 java.util 模块的所有公共类
  2. // 可直接使用 List、ArrayList 等,无需单独导入
  3. void main() {
  4.     List<String> list = new ArrayList<>();
  5. }
复制代码
老版写法
  1. import java.util.List;      // 显式导入单个类
  2. import java.util.ArrayList; // 显式导入另一个类
  3. public class Main {
  4.     public static void main(String[] args) {
  5.         List<String> list = new ArrayList<>();
  6.         System.out.println(list);
  7.     }
  8. }
复制代码
新版优点

减少冗余的导入语句,提升模块化代码的可读性和编写效率,尤其在依赖多模块时非常有用。
1.4 原始类型模式匹配(预览特性)

在 switch 和 instanceof 中直接匹配原始类型,如 int、boolean 等。
新版写法
  1. static void test(Object obj) {
  2.     if (obj instanceof int i) { // 直接匹配 int 类型
  3.         System.out.println("It's an int: " + i);
  4.     }
  5. }
复制代码
老版写法
  1. static void test(Object obj) {
  2.     if (obj instanceof Integer) { // 检查是否为 Integer 包装类型
  3.         int i = (int) obj;        // 显式拆箱
  4.         System.out.println("It's an int: " + i);
  5.     }
  6. }
复制代码
早期版本 instanceof 仅支持引用类型(如 Integer、String),需依赖装箱/拆箱(Integer → int)。
新版优点

统一原始类型与引用类型的模式匹配,简化类型判断逻辑,减少样板代码。
2.并发编程增强

2.1 作用域值(Scoped Values)

允许在线程内和跨线程共享不可变数据,旨在替代 ThreadLocal,优化虚拟线程不可变信息的传递。
新版写法
  1. import java.lang.ScopedValue;
  2. public class ScopedValueExample {
  3.     private static final ScopedValue<String> USER_ID = ScopedValue.newInstance();
  4.     public static void main(String[] args) throws Exception {
  5.         ScopedValue.where(USER_ID, "user123").run(() -> {
  6.             System.out.println("Current user: " + USER_ID.get());
  7.         });
  8.     }
  9. }
复制代码
新版优点

不可变性保证线程安全,内存占用比 ThreadLocal 低约 40%,生命周期自动绑定,无内存泄漏风险,尤其适合虚拟线程场景。
2.2 结构化并发(预览特性)

将运行在不同线程中的相关任务视为单个工作单元来管理,简化错误处理和取消操作。
新版写法
  1. try (var scope = StructuredTaskScope.<String>open()) {
  2.     Subtask<String> userTask = scope.fork(() -> fetchUser());
  3.     Subtask<String> orderTask = scope.fork(() -> fetchOrder());
  4.     scope.join(); // 等待所有子任务完成或任一失败
  5.     if (userTask.state() == Subtask.State.SUCCESS) {
  6.         return new Response(userTask.get(), orderTask.get());
  7.     } else {
  8.         throw new RuntimeException("Subtask failed", userTask.exception());
  9.     }
  10. }
复制代码
新版优点

提高并发代码的可靠性和可观察性,尤其利于错误传播和任务取消。
3.性能优化

3.1 紧凑对象头


  • 说明:将对象头从 128 位压缩至 64 位,减少小对象的内存占用。
  • 启用:添加 JVM 参数 -XX:+UseCompactObjectHeaders。
新版优点

显著减少内存占用(小型对象最多可节省 33%),提升执行效率(CPU 时间减少,GC 频率降低)。测试显示堆占用减少 22%,CPU 时间减少 8%,GC 次数减少 15%。无需修改代码即可受益,对微服务、云环境等内存受限场景尤其有利。
3.2 Shenandoah 分代垃圾回收器


  • 说明:Shenandoah GC 的分代模式正式成为生产就绪特性。
  • 启用:-XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational。
新版优点

针对新生代和老年代采用差异化回收策略,停顿时间降低高达 40%,适合高吞吐应用。
4.安全增强

引入一些列加密工具类,实现信息加密,例如引入基于晶格密码的 ML-KEM(密钥封装)和 ML-DSA(数字签名)算法,实现代码如下:
  1. KeyPairGenerator kpg = KeyPairGenerator.getInstance("ML-DSA");
  2. KeyPair kp = kpg.generateKeyPair();
  3. Signature sig = Signature.getInstance("ML-DSA");
  4. sig.initSign(kp.getPrivate());
  5. sig.update(message);
  6. byte[] signature = sig.sign();
  7. // 验证签名
  8. sig.initVerify(kp.getPublic());
  9. sig.update(message);
  10. boolean verified = sig.verify(signature);
复制代码
小结

JDK 25 作为最新的 LTS 版本,通过一系列新特性在开发效率(实例主方法、模块导入声明)、代码质量与可维护性(灵活构造函数体、结构化并发)、性能(紧凑对象头、Shenandoah 分代 GC)和安全性(抗量子加密、PEM API)等方面带来了显著提升。
升级建议

  • 对于新项目,可以考虑直接采用 JDK 25 LTS。
  • 对于现有项目,升级前务必进行充分测试
注意:Java25 移除对 32 位 x86 平台的支持,确保运行环境为 64 位。
希望这些信息能帮助你更好地理解和利用 JDK 25 的新特性!
本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:场景题、SpringAI、SpringAIAlibaba、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列、Dify、Coze、AI常见面试题等。
   

关注公众号(加好友):

            
作者:        王磊的博客        
出处:        http://vipstone.cnblogs.com/        
   

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册