2025年9月,Java开发者将迎来一个重要的里程碑——JDK25的发布。作为长期支持版本(LTS),JDK25不仅带来了多项语言增强,还在性能、安全和用户体验方面进行了显著优化。本文将为您详细介绍JDK25的主要功能预览,让您提前领略这一版本的强大功能。

语言特性增强

基本类型模式匹配(JEP 507)

JDK25在Java的模式匹配框架instanceofswitch中直接支持原始类型(如intboolean),打破基本类型(Primitive Types)与引用类型(Reference Types)在模式匹配中的隔阂,让基本类型在 instanceofswitch 中也能像对象一样灵活使用。例如:

1
2
3
4
5
6
7
8
9
10
11
12
// 使用 instanceof 检查安全转换
if (obj instanceof int i) {
System.out.println("这是一个可以安全存入 int 的数值: " + i);
}

// 在 switch 中直接匹配基本类型
return switch (val) {
case int i -> "整数: " + i;
case double d && d > 0 -> "正浮点数: " + d;
case boolean b -> "布尔值: " + b;
default -> "其他";
};

对比下Java21之前得做法

1
2
3
4
5
6
7
8
// 先判断类型
if (obj instanceof Long l) {
// 手动转换
if (l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) {
int i = l.intValue();
System.out.println("安全转换: " + i);
}
}

这一改进让代码更加简洁,提高了开发效率。

模块导入声明(JEP 511)

JDK25引入了import module语句,用于声明模块依赖,替代部分包导入。缺点是增加了重名得风险。例如:

1
2
3
4
5
6
7
8
9
10
//Java 21之前
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import java.io.File;
import java.nio.file.Path;

//Java 25
import module java.base;

压缩源文件与实例主方法(JEP 512)

JDK25简化了程序入口,支持类级别的void main()方法,无需public static修饰。如果你的 .java 文件中没有显式定义 class,编译器会为你自动生成一个隐式类(Implicitly Declared Class)。例如:

1
2
3
4
5
6
7
8
9
10
11
// Java 25之前
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}

// Java 25
void main() {
System.out.println("Hello Java 25!");
}

灵活的构造函数体(JEP 513)

JEP 513 是 Java 25(JDK 25)中一个非常实用的语法增强,全称为 “Flexible Constructor Bodies”(灵活的构造函数体)

它打破了 Java 自诞生以来的一条铁律:“构造函数的第一行必须是 super()this()。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Java21 之前
public class SubClass extends SuperClass {
public SubClass(int value) {
// 这里不能写 if (value < 0) ... 必须第一行就是 super
super(prepareValue(value));
}

private static int prepareValue(int v) {
if (v < 0) throw new IllegalArgumentException();
return v;
}
}

// Java25
public class SubClass extends SuperClass {
public SubClass(int value) {
// ✅ 允许:在 super 之前进行校验
if (value < 0) {
throw new IllegalArgumentException("值不能为负数");
}
// ✅ 允许:在 super 之前初始化自己的字段
this.someField = value * 2;

super(value); // 显式调用父类构造函数
}
}

关键规则:

虽然变灵活了,但 Java 依然保留了底层的安全红线,以确保对象初始化顺序的正确性:

  1. 序言(Prologue)限制:在调用 super() 之前的代码块被称为“序言”。在序言中,你不能访问 this 指针(即不能调用实例方法)
  2. 字段赋值:你可以给当前类定义的字段赋值,但不能读取它们。
  3. 构造函数链super()this() 依然必须被调用(显式或隐式),只是它们不再必须位于第一行。
  4. 异常处理:你可以在 super() 之前抛出异常,这样如果参数不合法,根本就不会触发昂贵的父类初始化过程,性能更优。

引入特性的原因:

  • 增强安全性:允许在父类构造函数运行之前验证参数,防止父类在无效状态下启动。

  • 代码可读性:不再需要为了绕过“第一行限制”而创建大量隐蔽的 private static 辅助方法。

  • 字段初始化:子类可以在父类构造函数运行前初始化自己的字段。这解决了一个经典坑:如果父类构造函数中调用了一个被子类覆写的方法,子类字段此时已经有值了,而不会是默认值。

性能优化

压缩对象头(JEP 519)

JDK25通过在对象中头使用紧凑的同步和标识数据布局,减少了64位体系结构上的对象头大小,从而减少了Java对象的内存占用。

String类性能改进

通过常量折叠优化,JDK25提升了静态不可修改Map的查询效率,加速了键值检索。

结构化并发

JDK25将子任务视为逻辑单元,父任务取消时自动终止子线程,简化了错误处理和取消操作,防止资源泄漏,提升了高并发的可靠性。

安全特性增强

抗量子加密算法

JDK25引入了基于晶格密码的ML-KEM(密钥)封装和ML-DSA(数字签名),以抵御未来量子计算攻击。

加密功能扩展

JDK25支持PEM格式密钥交换,并支持多种加密标准。

作用域值(ScopedValue)

JDK25引入了ScopedValue,替代ThreadLocal,支持线程间安全共享不可变数据,简化了生命周期管理。

体验优化

飞行记录仪(JFR)升级

JDK25增强了Linux系统CPU时间分析,精准定位性能瓶颈,并支持协作式采样,优化Java程序性能。

类文件API转正

JDK25标准化了类文件解析与生成接口,取代了ASM等第三方库。

垃圾回收器改进

JDK25正式转正了Shenandoah分代回收器,优化了内存管理效率,并增强了G1垃圾回收器的后期屏障,减少了停顿时间。

弃用陈旧特性

JDK25完全删除了32位x86平台的支持,包括删除相关源代码、移除构建配置和测试基础设施中与x86-32相关的内容,只保留对x86-64(64位)平台的支持,推动现代化硬件迁移。