Java 25 新特性 (LTS)
note
正式版发布时间(GA): 2025/09/16
官方发布介绍页面:https://openjdk.org/projects/jdk/25/
1. 语言特性与预览
JEP 507:模式、instanceof 和 switch 支持原始类型(第三次预览)
- 允许在所有模式上下文(如 instanceof、switch)中直接使用原始类型(如 int、double、boolean 等),不仅限于引用类型。
- 统一了模式匹配语法,减少装箱/拆箱操作,提升性能和代码可读性。
- 示例:
// 该示例展示了 instanceof、switch、解构等多种原始类型模式匹配用法。public class PatternPrimitiveDemo {public static void main(String[] args) {Object obj = 42;// 1. instanceof 原始类型if (obj instanceof int i) {System.out.println("是 int 类型,值为:" + i);} else {System.out.println("不是 int 类型");}// 2. switch 匹配原始类型Object value = 3.14;switch (value) {case int n -> System.out.println("int: " + n);case double d -> System.out.println("double: " + d);case null -> System.out.println("null");default -> System.out.println("其他类型");}// 3. 结合解构与类型判断Object[] arr = {1, 2.0, "hello", true};for (Object o : arr) {switch (o) {case int n -> System.out.println("int: " + n);case double d -> System.out.println("double: " + d);case boolean b -> System.out.println("boolean: " + b);default -> System.out.println("其他类型: " + o);}}}}
JEP 513:灵活的构造函数体(最终版)
- 允许在构造函数的 this(...) 或 super(...) 调用前,编写变量声明、前置校验等语句。
- 便于更灵活地初始化对象,提升代码可维护性。
- 示例:
// 该示例展示了在 super/this 调用前进行参数校验和日志记录的典型用法。public class User {private final String name;private final int age;public User(String name, int age) {// 构造器体前可做参数校验、日志等if (name == null || name.isBlank()) {throw new IllegalArgumentException("name 不能为空");}if (age < 0) {throw new IllegalArgumentException("age 不能为负数");}System.out.println("创建用户: " + name + ", age: " + age);this.name = name;this.age = age;}}public class Employee extends User {private final String department;public Employee(String name, int age, String department) {// 先做 department 校验,再调用父类构造器if (department == null || department.isBlank()) {throw new IllegalArgumentException("department 不能为空");}super(name, age);this.department = department;}}
JEP 511:模块导入声明(最终版)
- 引入
import module语法,允许在源文件中显式声明依赖的模块。 - 新增
import module xxx;,便于工具链分析依赖关系,提升大型项目的模块管理能力。 - 示例:
// 该示例展示了如何在源文件头部声明多个模块依赖,并结合普通 import 使用。// 声明依赖于 com.example.util 和 com.example.math 两个模块import module com.example.util;import module com.example.math;import com.example.util.StringUtils;import com.example.math.Calculator;public class Demo {public static void main(String[] args) {String s = StringUtils.capitalize("hello");int sum = Calculator.add(1, 2);System.out.println(s + ", sum=" + sum);}}
JEP 512:简化 main 方法和紧凑源文件(最终版)
- 允许 Java 程序入口 main 方法省略 String[] args 参数,支持极简单文件程序写法。
- 支持无类声明的顶级 main 入口,适合教学、脚本等场景。
- 示例:
// 该示例展示了 main 方法参数可选和顶级 main 的两种极简写法。// 1. 省略参数的 main 方法public class Hello {public static void main() {System.out.println("Hello, Java 25!");}}// 2. 顶级 main,无需类声明void main() {System.out.println("Hello, Java 25! (Top-level main)");}
JEP 502:稳定值(Stable Values,预览)
- 引入 StableValue 类型,允许持有不可变数据,并被 JVM 视为常量,享受与 final 字段类似的性能优化。
- 适合分阶段初始化应用状态,提升启动性能。
- 示例:
// 该示例展示了 StableValue 的典型用法:只允许初始化一次,后续只读。// 假设 StableValue API 如下(实际以官方为准)import java.lang.StableValue;public class StableValueDemo {static final StableValue<String> CONFIG = StableValue.create();public static void main(String[] args) {// 初始化一次CONFIG.set("配置项A");// 只读访问String value = CONFIG.get();System.out.println("配置: " + value);// 再次 set 会抛异常// CONFIG.set("B");}}
JEP 506:作用域值(正式版)
- 作用域值 API 正式发布,支持线程安全地传递只读数据,替代部分 ThreadLocal 场景。
- 生命周期受控,避免内存泄漏。
- 示例:
// 该示例展示了作用域值在主线程和子线程中的安全传递。import java.lang.ScopedValue;import java.util.concurrent.*;static final ScopedValue<String> USER = ScopedValue.newInstance();public class ScopedValueDemo {public static void main(String[] args) throws Exception {ScopedValue.where(USER, "张三").run(() -> {System.out.println("主线程用户: " + USER.get());ExecutorService pool = Executors.newSingleThreadExecutor();Future<?> f = pool.submit(() -> {System.out.println("子线程用户: " + USER.get());});f.get();pool.shutdown();});}}
JEP 505:结构化并发(第五次预览)
- 结构化并发 API 进入第五次预览,进一步简化多线程任务管理和错误处理。
- 新增 StructuredTaskScope,通过静态工厂方法创建,API 更加易用。
- 示例:
// 该示例展示了结构化并发下多任务统一管理和结果处理。import java.util.concurrent.*;public class StructuredConcurrencyDemo {public static void main(String[] args) throws Exception {try (var scope = StructuredTaskScope.ShutdownOnFailure.open()) {Future<String> user = scope.fork(() -> findUser());Future<Integer> order = scope.fork(() -> findOrder());scope.join(); // 等待所有任务完成if (user.isDone() && order.isDone()) {System.out.println("用户: " + user.get() + ", 订单: " + order.get());}}}static String findUser() { return "张三"; }static int findOrder() { return 1001; }}
2. 性能与运行时
JEP 519:紧凑对象头(正式版)
- HotSpot JVM 对象头从 96/128 位缩减为 64 位,减少堆内存占用,提高数据局部性。
- 该特性在 JDK 24 为实验性,JDK 25 起为正式特性。
# 启动参数中增加
-XX:+UseCompactObjectHeaders
更详细的解释请查看:点击下载
JEP 521:分代 Shenandoah 垃圾回收器(正式版)
- Shenandoah GC 的分代模式从实验性转为正式产品特性,提升吞吐量和内存利用率。
- 适合大规模、高并发、低延迟场景。
JEP 514:AOT 命令行参数优化
- 优化 Ahead-of-Time (AOT) 编译相关命令行参数,提升 AOT 使用体验。
JEP 515:AOT 方法级性能分析
- 支持 AOT 编译时对方法级别进行性能分析,提升热点方法识别和优化能力。
JEP 503:移除 32 位 x86 支持
- 移除 JDK 对 32 位 x86 平台的支持,专注于 64 位架构。
3. 标准库与 API
JEP 508:Vector API(第十次孵化)
- 持续孵化的 Vector API,支持高效 SIMD 向量化运算。
- 新增对 Float16 运算的自动向量化,底层实现更易维护。
- 示例:
// 该示例展示了如何用 Vector API 实现高效的向量加法。import jdk.incubator.vector.FloatVector;import jdk.incubator.vector.VectorSpecies;public class VectorDemo {static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED;public static void main(String[] args) {float[] a = {1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f};float[] b = {8f, 7f, 6f, 5f, 4f, 3f, 2f, 1f};float[] c = new float[a.length];int i = 0;for (; i < SPECIES.length(); i += SPECIES.length()) {var va = FloatVector.fromArray(SPECIES, a, i);var vb = FloatVector.fromArray(SPECIES, b, i);var vc = va.add(vb);vc.intoArray(c, i);}for (; i < a.length; i++) {c[i] = a[i] + b[i];}System.out.println(java.util.Arrays.toString(c)); // 输出: [9.0, 9.0, 9.0, 9.0, 9.0, 9.0, 9.0, 9.0]}}
JEP 510:密钥派生函数 API(正式版)
- 标准化密钥派生函数(KDF)API,支持 PBKDF2、HKDF、Argon2 等主流算法。
- 便于安全地从主密钥派生子密钥,提升密码学操作安全性。
- 示例:
// 该示例展示了如何用标准 KDF API 派生密钥并进行参数配置。import javax.crypto.SecretKey;import javax.crypto.spec.PBEKeySpec;import java.security.spec.KeySpec;import java.util.Base64;import java.security.SecureRandom;import javax.crypto.SecretKeyFactory;public class KDFDemo {public static void main(String[] args) throws Exception {String password = "myPassword";byte[] salt = new byte[16];new SecureRandom().nextBytes(salt);int iterations = 65536;int keyLength = 256;// 使用 PBKDF2WithHmacSHA256 派生密钥KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations, keyLength);SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");SecretKey key = factory.generateSecret(spec);byte[] encoded = key.getEncoded();System.out.println("派生密钥: " + Base64.getEncoder().encodeToString(encoded));}}
JEP 470:PEM 编码加解密 API(预览)
- 新增 PEM 格式加解密 API,简化密钥、证书等对象的 PEM 编解码。
- 支持 PKCS#8、X.509 等标准格式的互转。
- 示例:
// 该示例展示了 PEM 证书的读取与解析,写入需参考官方 API。// 伪代码,实际 API 以官方为准import java.nio.file.Files;import java.nio.file.Path;import java.security.cert.CertificateFactory;import java.security.cert.X509Certificate;import java.io.InputStream;public class PemDemo {public static void main(String[] args) throws Exception {// 读取 PEM 格式证书byte[] pemBytes = Files.readAllBytes(Path.of("cert.pem"));InputStream in = new java.io.ByteArrayInputStream(pemBytes);CertificateFactory cf = CertificateFactory.getInstance("X.509");X509Certificate cert = (X509Certificate) cf.generateCertificate(in);System.out.println("证书主题: " + cert.getSubjectDN());// 写 PEM(实际需用官方 API)// Pem.write(cert, Path.of("out.pem"));}}
4. 工具链与监控
JEP 509:JFR CPU 时间采样(实验性)
- JDK Flight Recorder (JFR) 新增 CPU 时间采样功能,便于性能分析和故障定位。
JEP 518:JFR 协作采样
- JFR 支持协作采样,提升多线程环境下的性能分析精度。
JEP 520:JFR 方法定时与追踪
- JFR 新增方法级别的定时与追踪功能,便于热点方法定位和性能瓶颈分析。
5. 兼容性、移除与废弃
JEP 503:移除 32 位 x86 支持
- 移除 JDK 对 32 位 x86 平台的支持,专注于 64 位架构。
移除/废弃项
- 移除/废弃部分老旧 API、命令行参数、JNDI 远程代码下载、JMX 早期序列化兼容逻辑等。
- 弃用 jstatd、jrunscript 工具,jdk.jsobject 模块,LockingMode 标志等。
6. 其他重要变更与修复
- String::hashCode 支持常量折叠优化,静态不可变 Map 场景下性能提升明显。
- jar 工具增强,支持 --keep-old-files、--dir 等新选项。
- 虚拟线程调度器监控,新增 MXBean 和 jcmd 命令支持。
- 安全属性文件支持 include 指令,便于分模块管理安全配置。
- TLS/SSL 相关增强,如 TLSv1.3 新会话票据数量可配置、支持模式匹配禁用 Cipher Suite。
- XML/JAXP:内置 W3C DTD/XSD,调整默认限制,增强安全性。
- CLDR 46/时区数据库 2024b,本地化和时区数据全面更新。
- 弃用/移除部分老旧 API 和命令行参数,详见官方文档。
7. 已知问题与修复
- 修复了 lambda 表达式、反射、类加载等相关的若干兼容性和行为问题。
- 修复了 Windows 下 CPU 负载监控、JDK RPM 升级遗留、Socket 连接等问题。
- 详见 JDK 25 Release Notes。
本文档为 JDK 25 主要新特性与变更的详细中文说明,便于开发者快速查阅和理解。如需了解更详细的实现细节,请参考官方 JEP 页面和 Release Notes。