Java 25 发布,这是继 Java 21 之后的又一个 长期支持(LTS)版本,带来了更简洁的语法、更强的性能优化以及更现代化的工具支持
Java 25 概览
- Java 25 是一个 长期支持(LTS) 版本,将于 2025年9月16日 正式 GA 发布时间。
- 本次版本中包含 18 个 JEPs(Java Enhancement Proposals),包括一些预览(preview)、孵化(incubator)、实验性(experimental)以及最终稳定(closed / 已交付)特性。
主要语言/语法/编译器增强
- 灵活的构造函数体 (Flexible Constructor Bodies, JEP 513)
在 Java25 中,可以在调用 super(...)
或 this(...)
之前写一些语句,比如参数验证等。以前这些调用必须是构造函数中的第一行。
复制
展开
class Person {
final int age;
Person(int age) {
this.age = age;
}
}
class Employee extends Person {
final String name;
public Employee(String name, int age) {
// 验证参数
if (age < 18 || age > 67) {
throw new IllegalArgumentException("Age must be between 18 and 67");
}
// 可以在调用 super(...) 前做设置
this.name = name;
super(age);
}
}
- 原始类型在模式匹配 (Primitive Types in Patterns, instanceof, and switch, JEP 507, 第三预览)
模式匹配(pattern matching)中现在支持原始类型(primitive types,比如 int
, long
, double
等)。也就是说 instanceof
和 switch
中的模式可以直接匹配原始类型,而不必总是用封装类型。
复制
展开
Object obj = 42;
if (obj instanceof int i) {
System.out.println("It's an int: " + i);
}
// 在 switch 中
int x = 3;
switch (x) {
case int i -> System.out.println("int: " + i);
case long l -> System.out.println("long: " + l);
default -> System.out.println("other");
}
- 紧凑源文件与实例 main 方法 (Compact Source Files and Instance Main Methods, JEP 512)
Java 25 简化了写“最小程序/脚本/示例”的流程。现在可以写更少样板代码,不必每次都声明 public class … public static void main(String[] args)
。可以有顶层的或者实例级main
方法,源文件更紧凑。
复制
展开
void main() {
System.out.println("Hello from Java 25 compact source!");
}
- 模块导入声明 (Module Import Declarations, JEP 511)
新增 import module
声明,允许在源文件顶部导入整个模块,使模块依赖在源代码里可见,而不仅仅在 module-info.java
中。对于大型模块化系统,有助于可读性和管理。
复制
展开
import module java.base;
import module java.sql;
import java.sql.Date;
public class Test {
public static void main(String[] args) {
Date d = Date.valueOf("2025-09-16");
System.out.println(d);
}
}
性能 /运行时 /JVM /工具增强
下面这些是提升性能、缩短启动时间、减少资源消耗、改进监控/profiling 等方面的重要特性。
- 紧凑对象头 (Compact Object Headers, JEP 519)
- 对象的头部(object header)从旧的 16 字节缩减到 8 字节(在满足条件下),节省大量内存,特别是当应用中有很多小对象时。
复制
展开
-XX:+UseCompactObjectHeaders
- Generational Shenandoah 垃圾收集器 (JEP 521)
- Shenandoah GC 的分代(generation)模式成为生产支持的特性(之前为实验性)。分代 GC 可以提高短生命周期对象的回收效率,从而减少延迟和提升吞吐。
- 提前方法分析 / 启动优化 (Ahead-of-Time Method Profiling, JEP 515; AOT 命令行工程化, JEP 514)
- JEP 515:对于热点方法(被频繁调用的方法)进行“提前”采样或预分析,以帮助在应用启动阶段更快地做优化。
- JEP 514:改进 AOT(Ahead-of-Time)类加载与链接的命令行体验,使得生成并使用 AOT 缓存更加简明。
- Java Flight Recorder (JFR) 的增强
- CPU-time profiling(在 Linux 上实验性) — 跟踪线程的 CPU 使用时间以便更精确的性能剖析。
- 方法计时与追踪 (method timing & tracing);
- 协作采样 (cooperative sampling) 等机制改善分析偏差 /延迟问题。
- 稳定值 (Stable Values, JEP 502)(Preview)
- 这个特性允许某些值被初始化后视为常量,由 JVM 在访问后可做更多优化,比如类似 final 的行为但更强(对延迟初始化、安全性或反射访问可能有不同处理)。
- 加密与密钥派生/PEM 编码 (Key Derivation Function API, JEP 510;PEM Encodings of Cryptographic Objects, JEP 470)
- 提供标准 API 来做密钥派生(例如 PBKDF2,Argon2 等)功能。
- 提供 PEM 格式的编/解码功能,对密钥、证书、CRL(撤销列表)等的 PEM 表示支持更方便。
其他变动 /弃用 /移除
- 移除 32 位 x86 架构的支持(即不再为 32 位 x86 平台提供 JDK 构建)。
- 一些 I/O/File 行为的小改动,例如
java.io.File("")
表示当前目录的行为一致性改进。 - Windows 上
File.delete()
不再删除标记为 “只读(Read-only)” 的文件,除非有特定系统属性允许。
简单示例几个组合用法
以下是一个小示例程序,综合使用几个新特性来演示 Java 25 的写法差异/优势。
复制
展开
// 文件名:Demo25.java
import module java.base;
// 引入整个 java.base 模块,例子中 java.lang, java.util 等包可以直接使用
class Demo25 {
// 使用实例 main 方法 + 紧凑源文件特性 (Compact source files & instance main methods)
void main() {
System.out.println("Starting Demo25");
int x = 10;
switch (x) {
case int i -> System.out.println("Primitive pattern matched int: " + i);
case long l -> System.out.println("Primitive pattern matched long: " + l);
default -> System.out.println("other");
}
Employee emp = new Employee("Bob", 30);
System.out.println("Employee: " + emp.name + ", age: " + emp.age);
}
}
class Person {
final int age;
Person(int age) {
this.age = age;
}
}
class Employee extends Person {
final String name;
public Employee(String name, int age) {
// 在调用 super(...) 前做验证 + 初始化 name 字段
if (name == null || name.isBlank()) {
throw new IllegalArgumentException("Name must be non-null and non-blank");
}
this.name = name;
super(age);
}
}
在这个例子中:
- 用了
import module java.base;
显示模块导入声明。 - 用了紧凑源文件 + 实例 main 方法(不用
public static void main(String[] args)
)。 - 用了原始类型模式匹配 in
switch
。 - 用了灵活构造函数体,在调用
super
前做验证 &初始化字段。
总结
Java 25 是一个在很多方面 “打磨” 过的版本 —— 不只是新特性,更是在性能、内存、编译器体验、语法简化、模块化支持上都有提升。对于开发者来说:
- 写更少样板代码(样板 class /main 方法 /构造函数限制减弱等)意味着更快速原型/demo/脚本开发更轻松。
- 性能与内存方面的提升(紧凑对象头、Shenandoah 分代 GC、JFR 的精准剖析、AOT 方法分析等)对生产环境尤其重要。
- 安全/加密支持(密钥派生/PEM 编码等)更现代、更方便。
作者:https://blog.xn--rpv331d.com/望舒
链接:https://blog.xn--rpv331d.com/望舒/blog/115
转载注意保留文章出处...
No data