2025年9月16日,Java 25正式发布! 作为下一个长期支持(LTS)版本,它将支持到2030年,并延续到2033年。这不仅仅是一个普通的版本更新,而是将塑造未来十年Java生态的重要里程碑。
核心功能速览表
JEP 编号 | JEP 标题 | 状态 |
JEP 512 | 紧凑的源代码文件与实例main方法 | 稳定 |
JEP 511 | 模块导入声明 | 稳定 |
JEP 513 | 灵活的构造函数体 | 稳定 |
JEP 507 | 模式匹配支持原始类型 | 预览 |
JEP 505 | 结构化并发 | 预览 |
JEP 506 | Scoped Values | 稳定 |
JEP 519 | 紧凑型对象头 | 稳定 |
JEP 514 | AOT 编译命令行简化 | 稳定 |
JEP 515 | AOT 提前编译分析 | 稳定 |
JEP 521 | 分代式Shenandoah | 稳定 |
JEP 508 | Vector API | 孵化 |
JEP 510 | 密钥派生函数API | 稳定 |
JEP 470 | PEM编码API | 预览 |
JEP 509/518/520 | JFR 监控增强 | 实验/稳定 |
JEP 503 | 移除 32位x86 支持 | 移除 |
核心语言特性
1. 原始类型模式匹配(JEP 507)
告别繁琐的装箱拆箱,直接对原始类型进行模式匹配:
Object thing = 42;
if (thing instanceof int i) {
System.out.println("原始类型检测: " + i);
// 无需装箱,直接使用int值
}
// 支持多种原始类型
int value = 42;
if (value instanceof byte b) {
System.out.println("Byte类型: " + b);
} else if (value instanceof short s) {
System.out.println("Short类型: " + s);
} else {
System.out.println("其他类型: " + value);
}
2. 模块导入声明(JEP 511)
一行代码导入整个模块,告别冗长的import语句:
// 传统方式
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
// Java 25新方式
import module java.sql;
3. 紧凑源文件和实例主方法(JEP 512)
让Java更像脚本语言,快速原型开发:
// 无需类声明,直接写main方法
void main() {
System.out.println("是的,这就是有效的Java代码!");
System.out.println("适合快速脚本和演示");
}
4. 灵活构造函数规则(JEP 513)
构造函数更加灵活,支持在super()调用前执行逻辑:
public class User {
private String name;
public User(String name) {
validate(name); // 现在可以在super()之前执行
super();
this.name = name;
}
private void validate(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("姓名不能为空");
}
}
}
性能与可持续性
1. 紧凑对象头(JEP 519)
- 内存优化:减少每个对象的内存开销
- 绿色计算:降低堆内存使用,提升能源效率
- 性能提升:减少GC压力,提升应用性能
2. AOT编译与启动分析(JEP 514 & 515)
// 启动时间分析
java -XX:+StartupAnalysis MyApp
3. 分代Shenandoah垃圾回收器(JEP 521)
- 低延迟:暂停时间控制在10ms以内
- 高吞吐:适合大内存应用
- 自适应:根据应用特性自动调优
安全性增强
1. PEM API(JEP 470)
简化证书和密钥处理,无需第三方库:
// 读取PEM格式证书
var certificate = Pem.decodeCertificate(pemString);
// 写入PEM格式私钥
var privateKey = Pem.decodePrivateKey(keyString);
// 完整的PEM处理示例
public class PEMExample {
public static void main(String[] args) {
String pem = """
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgjDohS0RHP395oJxciVaeks9N
KNY5m9V1IkBBwYsMGyxskrW5sapgi9qlGSYOma9kkko1xlBs17qG8TTg38faxgGJ
sLT2BAmdVFwuWdRtzq6ONn2YPHYj5s5pqx6vU5baz58/STQXNIhn21QoPjXgQCnj
Pp0OxnacWeRSnAIOmQIDAQAB
-----END PUBLIC KEY-----
""";
try {
var cert = Pem.decodeCertificate(pem);
System.out.println("证书算法: " + cert.getPublicKey().getAlgorithm());
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. 密钥派生函数API(JEP 510)
统一的KDF处理接口,支持多种算法:
// PBKDF2密钥派生
var key = KDF.PBKDF2.derive(secret, salt, 10000, 256);
// Argon2密钥派生
var key2 = KDF.Argon2.derive(secret, salt, 65536, 2, 1, 32);
// 传统方式对比
public class KeyDerivationExample {
public static void main(String[] args) throws Exception {
char[] password = "hunter2".toCharArray();
byte[] salt = "somesalt".getBytes();
// Java 25新方式
var newKey = KDF.PBKDF2.derive(password, salt, 65536, 256);
// 传统方式
PBEKeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
SecretKey oldKey = factory.generateSecret(spec);
System.out.println("新API密钥格式: " + newKey.getFormat());
System.out.println("传统API密钥格式: " + oldKey.getFormat());
}
}
高级并发特性
1. 作用域值(ScopedValue,JEP 506)
轻量级的ThreadLocal替代方案,特别适合虚拟线程:
import java.lang.ScopedValue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ScopedUserExample {
static final ScopedValue<String> USER = ScopedValue.newInstance();
public static void main(String[] args) {
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> ScopedValue.where(USER, "Alice").run(() -> {
System.out.println("线程: " + Thread.currentThread());
System.out.println("用户: " + USER.get());
}));
executor.submit(() -> ScopedValue.where(USER, "Bob").run(() -> {
System.out.println("线程: " + Thread.currentThread());
System.out.println("用户: " + USER.get());
}));
Thread.sleep(200);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
2. 结构化并发(JEP 505)
将相关线程视为单一工作单元,简化并发编程:
import java.util.concurrent.StructuredTaskScope;
public class StructuredExample {
static String fetchUser() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "Alice";
}
static String fetchOrder() {
try {
Thread.sleep(150);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "Order#42";
}
public static void main(String[] args) throws Exception {
try (var scope = StructuredTaskScope.<String>open()) {
var userTask = scope.fork(() -> fetchUser());
var orderTask = scope.fork(() -> fetchOrder());
scope.join();
System.out.println(userTask.get() + " - " + orderTask.get());
}
}
}
3. 稳定值API(StableValue,JEP 502)
扩展Optional语义到上下文稳定的不可变值:
import java.lang.StableValue;
public class StableExample {
public static void main(String[] args) {
// 创建未设置的StableValue
var greeting = StableValue.<String>of();
String message = greeting.orElseSet(() -> "Hello from StableValue!");
System.out.println(message);
// 适用于缓存和惰性求值
var cache = StableValue.<String>of();
String cachedValue = cache.orElseSet(() -> expensiveOperation());
}
private static String expensiveOperation() {
// 模拟耗时操作
return "Expensive result";
}
}
JVM内部改进
1. CPU时间分析(JEP 509)
# 精确的CPU使用分析
java -XX:+CPUProfiling MyApp
2. 协作采样(JEP 518)
- 改进JFR采样机制
- 降低性能开销
- 提供更准确的性能数据
3. 方法追踪(JEP 520)
// 无需代理,直接追踪方法执行
@TraceMethod
public void criticalMethod() {
// 方法执行会被自动追踪
}
向量计算API(JEP 508)
Java 25引入了强大的向量API,支持SIMD指令优化:
import jdk.incubator.vector.*;
public class VectorExample {
public static void main(String[] args) {
float[] left = {1f, 2f, 3f, 4f};
float[] right = {5f, 6f, 7f, 8f};
FloatVector a = FloatVector.fromArray(FloatVector.SPECIES_128, left, 0);
FloatVector b = FloatVector.fromArray(FloatVector.SPECIES_128, right, 0);
FloatVector c = a.add(b);
float[] result = new float[FloatVector.SPECIES_128.length()];
c.intoArray(result, 0);
System.out.println("向量结果: " + java.util.Arrays.toString(result));
}
}
编译参数:--enable-preview --add-modules jdk.incubator.vector