【Java新特性】Java 21 新特性全解析
作为 Java 语言的又一长期支持版本(LTS),JDK 21 于 2023 年 9 月 19 日正式发布,带来了 15 个重要新特性。这个版本不仅延续了 Java 近年来的快速进化节奏,更在生产力提升、性能优化和语法简化等方面带来了诸多突破性更新。本文将带你深入解读其中最值得关注的特性,帮助开发者快速掌握 Java 21 的核心变化。
一、字符串模板(String Templates):简化字符串处理
字符串拼接一直是 Java 开发中的痛点,无论是+
号拼接的繁琐,还是String.format()
的格式符记忆负担,都影响着代码的可读性和开发效率。Java 21 引入的字符串模板(预览功能) 终于解决了这一问题。
核心用法
通过STR
模板处理器和${}
占位符,可直接在字符串中嵌入变量或表达式:
String name = "Java开发者";
String message = STR."欢迎你,\{name}!";
三大模板处理器
- STR:基础处理器,自动将表达式转换为字符串并替换
- FMT:支持格式控制,如
FMT."数值:%.2f\{pi}"
- RAW:返回原始
StringTemplate
对象,可自定义处理逻辑
优势体现
相比传统方式,字符串模板更简洁直观:
// 传统方式
String info = "用户" + user.getName() + ",年龄" + (user.getAge() + 1) + "岁";// 字符串模板
String info = STR."用户\{user.getName()},年龄\{user.getAge() + 1}岁";
二、序列化集合(Sequenced Collections):统一有序集合操作
Java 集合框架长期缺乏对有序集合的统一处理接口,List
、Set
和Map
的有序操作各自为政。Java 21 新增的序列化集合接口体系解决了这一问题。
核心接口
- SequencedCollection:为有序集合提供统一的首尾元素操作
interface SequencedCollection<E> extends Collection<E> {SequencedCollection<E> reversed(); // 反向视图void addFirst(E);void addLast(E);E getFirst();E getLast();E removeFirst();E removeLast();
}
- SequencedSet:继承
SequencedCollection
,为有序 Set 提供统一操作 - SequencedMap:为有序 Map 提供首尾键值对操作,如
putFirst()
、reversed()
实际应用
以LinkedHashMap
为例:
LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
map.put(1, "Java");
map.put(2, "Python");map.firstEntry(); // 1=Java
map.putLast(3, "Go");
System.out.println(map.reversed()); // {3=Go, 2=Python, 1=Java}
三、分代 ZGC(Generational ZGC):提升垃圾回收性能
ZGC 是 Java 的低延迟垃圾收集器,Java 21 为其引入分代功能,进一步优化性能。
核心改进
- 基于对象生命周期划分年轻代和老年代
- 针对年轻代进行更频繁的收集,减少整体停顿时间
- 保持 ZGC 原有的低延迟特性,同时提高吞吐量
启用方式
目前需手动开启,未来将成为默认配置:
java -XX:+UseZGC -XX:+ZGenerational Application
此特性对大型应用和高并发场景尤其重要,能显著提升系统响应速度。
四、模式匹配增强:switch 表达式的革命性升级
Java 21 正式稳定了switch 的模式匹配功能,允许在 case 标签中使用类型模式,大幅简化条件判断代码。
典型应用
static String formatObject(Object obj) {return switch (obj) {case Integer i -> STR."整数:\{i}";case String s && s.length() > 5 -> STR."长字符串:\{s}";case Double d -> STR."小数:\{d}";default -> STR."未知类型:\{obj.getClass()}";};
}
优势特点
- 支持类型判断与变量绑定一体化
- 可结合逻辑表达式(如
&&
)进行复杂判断 - 编译期检查覆盖完整性,减少运行时错误
五、虚拟线程(Virtual Threads):轻量级并发新体验
作为 Java 并发模型的重大革新,虚拟线程在 Java 21 正式转正。虚拟线程是轻量级线程,由 JVM 管理而非操作系统,能大幅提高并发处理能力。
核心优势
- 极低的创建成本,可轻松创建百万级线程
- 与现有代码兼容,无需修改
Runnable
/Callable
接口 - 显著提升 I/O 密集型应用的吞吐量
使用方式
// 方式1:直接创建
Thread vt = Thread.startVirtualThread(() -> {// 业务逻辑
});// 方式2:线程池
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {executor.submit(() -> task1());executor.submit(() -> task2());
}
对于 Web 服务器等场景,虚拟线程可在相同硬件资源下处理数倍于传统线程的请求。
六、其他重要特性
记录模式(Record Patterns):简化记录类型的解构操作,如:
if (obj instanceof Point(int x, int y)) {System.out.println("坐标:" + x + "," + y);
}
未命名模式和变量:用_
表示未使用的变量,提高代码可读性:
try (var _ = resource.acquire()) { // 无需使用的资源// 业务逻辑
}
外部函数和内存 API(第三次预览):安全高效地调用本地代码和访问本地内存,替代 JNI 的复杂实现。
总结
Java 21 作为 LTS 版本,带来了诸多革命性更新:字符串模板简化了字符串处理,序列化集合统一了有序操作,虚拟线程重塑了并发模型,分代 ZGC 提升了性能表现。这些特性不仅提高了开发效率,更拓展了 Java 在高并发、大数据领域的应用能力。