Java 21 的主要新特性:虚拟线程、字符串模板 等等

发布时间:2025-05-14      访问量:58
Java 21 于 2023 年 9 月发布,带来了多项重要特性和改进,包括**标准化的虚拟线程(Virtual Threads)**、**字符串模板(String Templates)**、**记录模式(Record Patterns)**、**switch 模式匹配增强**等。以下是核心新特性的概述:


**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 模式匹配等特性进一步增强了类型安全和代码简洁性。建议在生产环境中谨慎使用预览特性,待正式发布后再全面采用。
堆内存
多线程
strdup
初始化器
冒泡排序
增删改查
BufferedReader
输入输出
面向对象
生命周期
闭包的概念
原型链
Flask
mysql-connector-python
单例模式
浅拷贝
隔离级别
索引
InnoDB
左连接
聚合函数
PuTTY
TRUNCATE
str_starts_with_many
DateTime
array_combine
闭包的概念