Java 14 新特性
1. 前言
JDK 14是由JSR 389在Java社区推进中指定的Java SE平台版本14的开源参考实现。已于2020年3月17日正式发布。此版本所包含的JEP(Java增强提案,Java Enhancement Propostal),共16个新特性。其中包含两个孵化器模块(Incubator)、三个预览特性(Preview)、两个弃用功能(Deprecate)和两个删除功能(Remove)。
2. 模块说明
- 孵化器模块(Incubator):将尚未定稿的API和工具先交给开发者使用 ,以获得反馈,并用这些反馈进一步改进Java平台的质量
- 预览特性(Preview):规格已经成型、实现已经确定,但还未最终定稿的功能。它们出现在Java中的目的是收集在真实世界中使用后的反馈信息,促进这些功能的最终定稿。 这些特性可能会根据开发者的反馈结果,发生改动,甚至可能会被移除(通常预览特性最终都会有所保留)
- 弃用功能(Deprecate):开发者不应该继续使用这些功能,应当将使用这些功能的现有代码迁移到其他API上
- 删除功能(Remove):较上一个版本而言,这些功能已经被删除,开发者在这个版本已不能使用该功能
3. 新特性速览
JDK 14新增的16个新特性,有部分与开发者日常编程息息相关,该部分新特性在如下表格中通过标红进行标识,本文主要对标红的JEP进行讲解,表格如下:
NO | Title | 说明 |
---|---|---|
305 | Pattern Matching for instanceof (Preview) | instanceof 的模式匹配(预览) |
343 | Packaging Tool (Incubator) | 打包工具(孵化) |
345 | NUMA-Aware Memory Allocation for G1 | G1 的NUMA 内存分配优化 |
349 | JFR Event Streaming | JFR事件流 |
352 | Non-Volatile Mapped Byte Buffers | 非原子性的字节缓冲区映射 |
358 | Helpful NullPointerExceptions | 非常有帮助的空指针异常 |
359 | Records (Preview) | Records(预览) |
361 | Switch Expressions (Standard) | Switch 表达式(标准) |
362 | Deprecate the Solaris and SPARC Ports | 弃用 Solaris 和S PARC 端口 |
363 | Remove the Concurrent Mark Sweep (CMS) Garbage Collector | 移除 CMS(Concurrent Mark Sweep)垃圾收集器 |
364 | ZGC on macOS | macOS 系统上的 ZGC |
365 | ZGC on Windows | Windows 系统上的 ZGC |
366 | Deprecate the ParallelScavenge + SerialOld GC Combination | 弃用 ParallelScavenge + SerialOld GC 组合 |
367 | Remove the Pack200 Tools and API | 移除Pack200 Tools和API |
368 | Text Blocks (Second Preview) | 文本块(第二个预览版) |
370 | Foreign-Memory Access API (Incubator) | 外部存储器API(孵化) |
4. 详细说明
4.1 Pattern Matching for instanceof (Preview)
instanceof 的模式匹配。使用匹配模式增强Java编程语言中的instanceof操作符。模式匹配允许程序中的共有的逻辑(即从对象中有条件地提取组件)更简洁、更安全地表达。这是JDK 14中的一个预览语言特性。
老版本使用姿势
/**
* 老版本的instanceof判断后,须显示强转
*/
@Test
public void testOld() {
Object strObj = "Hello Instanceof!";
if (strObj instanceof String) {
// 显示强转
String str = (String) strObj;
System.out.println(str.contains("Hello"));
}
}
新版本使用姿势
/**
* 新版本的instanceof的使用,无须显示强转
*/
@Test
public void testNew() {
Object strObj = "Hello Instanceof!";
if (strObj instanceof String str) {
// 无需显示的进行强转
System.out.println(str.contains("H