**1. 虚拟线程(Virtual Threads)- 正式特性**
虚拟线程是轻量级线程,可显著提高并发应用的吞吐量。与传统线程(OS 线程)相比,虚拟线程数量可达到百万级,且资源消耗极少。
**核心优势**
- **简化并发编程**:使用与传统线程相同的 API(`Thread`、`ExecutorService`)。
- **提升吞吐量**:减少线程上下文切换开销。
- **低资源消耗**:单个 JVM 可创建数百万个虚拟线程。
**示例代码**
java
// 创建并启动虚拟线程
Thread.startVirtualThread(() -> {
System.out.println("Hello from a virtual thread!");
});
// 使用 ExecutorService 管理虚拟线程
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 1000).forEach(i -> {
executor.submit(() -> {
Thread.sleep(Duration.ofMillis(100));
return i;
});
});
} // 自动关闭 executor
**2. 字符串模板(String Templates)- 预览特性**
引入新的字符串处理语法,支持嵌入表达式,替代 `String.format()` 和拼接操作。
**语法形式**
- **简单模板**:使用 `STR.`` 包裹,`${}` 内为表达式。
- **原始模板**:使用 `RAW.`` 包裹,不处理转义字符(如 `\n`)。
**示例代码**
java
// 简单模板
var name = "Alice";
var age = 30;
var message = STR."Hello, \{name}! You are \{age} years old.";
// 等价于 "Hello, Alice! You are 30 years old."
// 原始模板
var raw = RAW."Line 1\nLine 2";
// 等价于 "Line 1\nLine 2",不会转换为换行
// 复杂表达式
var price = 9.99;
var tax = 0.08;
var total = STR."Total: $\{price * (1 + tax):.2f}";
// 等价于 "Total: $10.79"
**3. 记录模式(Record Patterns)- 第二次预览**
增强模式匹配能力,支持解构记录(Record)类型,简化数据提取。
**示例代码**
java
// 定义记录类型
record Point(int x, int y) {}
// 模式匹配解构记录
void printSum(Object obj) {
if (obj instanceof Point(int x, int y)) {
System.out.println(x + y); // 直接使用解构后的变量
}
}
// 嵌套记录模式
record Rectangle(Point topLeft, Point bottomRight) {}
void printDimensions(Rectangle rect) {
if (rect instanceof Rectangle(Point(int x1, int y1), Point(int x2, int y2))) {
System.out.println("Width: " + (x2 - x1));
System.out.println("Height: " + (y2 - y1));
}
}
**4. Switch 模式匹配 - 第二次预览**
扩展 `switch` 表达式和语句的能力,支持更灵活的模式匹配。
**示例代码**
java
// 匹配不同类型
Object obj = "Hello";
int result = switch (obj) {
case Integer i -> i * 2;
case String s -> s.length();
case null, default -> 0;
};
// 守卫条件(guard)
int num = 10;
String category = switch (num) {
case int n when n < 0 -> "Negative";
case int n when n > 100 -> "Large";
default -> "Normal";
};
**5. 向量 API(Vector API)- 第四次孵化**
提供高性能向量计算能力,替代手动循环,充分利用 CPU 的向量指令(如 SIMD)。
**示例代码**
java
import jdk.incubator.vector.*;
// 向量加法
float[] a = {1.0f, 2.0f, 3.0f, 4.0f};
float[] b = {5.0f, 6.0f, 7.0f, 8.0f};
float[] c = new float[4];
VectorSpecies<Float> species = FloatVector.SPECIES_128;
for (int i = 0; i < a.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);
}
// c 现在是 [6.0, 8.0, 10.0, 12.0]
**6. 未命名模式和变量(Unnamed Patterns and Variables)- 预览**
允许在模式匹配中使用 `_` 表示不关心的变量,提高代码简洁性。
**示例代码**
java
// 忽略不需要的变量
record Person(String name, int age) {}
void printName(Person p) {
if (p instanceof Person(String name, _)) {
System.out.println(name);
}
}
// 在 switch 中使用
Object obj = new Point(10, 20);
switch (obj) {
case Point(_, int y) -> System.out.println("Y coordinate: " + y);
default -> System.out.println("Not a point");
}
**7. 结构化并发(Structured Concurrency)- 孵化**
简化多线程编程,将不同线程中的任务视为单一工作单元,统一管理生命周期。
**示例代码**
java
import java.util.concurrent.StructuredTaskScope;
// 并行获取用户信息和订单信息
Result fetchUserAndOrder() throws InterruptedException {
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Future<String> user = scope.fork(() -> fetchUser());
Future<Order> order = scope.fork(() -> fetchOrder());
scope.join(); // 等待所有任务完成
scope.throwIfFailed(); // 处理任何失败
return new Result(user.resultNow(), order.resultNow());
}
}
**8. 其他改进**
1. **正则表达式改进**:
- 支持匹配换行符的 `\R` 转义序列。
- 新增 `Matcher.renameGroup()` 方法重命名捕获组。
2. **垃圾回收器优化**:
- G1 垃圾回收器性能提升,减少暂停时间。
3. **平台日志 API 改进**:
- 增强 `java.util.logging` 功能,支持结构化日志。
4. **Deprecation 增强**:
- 新增 `@Deprecated(since = "21", forRemoval = true)` 注解,明确移除时间。
**总结**
Java 21 的核心亮点在于**虚拟线程**和**字符串模板**,前者大幅提升并发性能,后者简化字符串处理。记录模式、switch 模式匹配等特性进一步增强了类型安全和代码简洁性。建议在生产环境中谨慎使用预览特性,待正式发布后再全面采用。