JDK 16已經於2021年3月16日如期發佈。本文介紹JDK 16新特性。
發佈版本說明
根據發佈的規劃,這次發佈的 JDK 16 將是一個短期的過度版。下一個長期支持版(LTS 版)會在今年的 9 月份候發佈(Java 17),LTS 版每 3 年發佈一個,上一次長期支持版是 18 年 9 月發佈的 JDK 11。
JDK 16是Java SE平臺版本16的開源參考實現,由JSR 390在JCP(Java Community Process)指定。
安裝包下載
主要分為OpenJDK版本和Oracle版本,下載地址如下:
- OpenJDK版本:https://jdk.java.net/16/
- Oracle版本:https://www.oracle.com/java/technologies/javase-jdk16-downloads.html
上述版本,如果是個人學習用途,則差異不大。但如果是用於商業用途,則需要仔細看好相關的授權。Oracle JDK根據二進制代碼許可協議獲得許可,而OpenJDK根據GPL v2許可獲得許可。
更多有關Java的基本知識,可以參閱《Java核心編程》這本書,描述的非常詳細。
JDK 16 新特性說明
JDK 16 為用戶提供了17項主要的增強/更改,包括全新的 Java 語言改進,工具和內存管理,以及還有一些孵化和預覽特性,有了這些新功能,Java 會進一步提高開發人員的生產力。
值得關注的變化是,JDK 14 中提供的預覽特性:模式匹配和記錄(Records),經過一年的社區反饋和實際應用,終於在 JDK 16 中完成最終落地了。
另外,Oracle 還為 Java SE 訂閱服務中免費提供 GraalVM 企業版服務,GraalVM 可以幫助提高應用程序的性能並減少資源消耗,尤其是在微服務和雲原生架構中。
1. 338: Vector API (孵化)
這個不是集合中的Vector,而是一個新的初始迭代孵化器模塊jdk.incubator.vector
,用於表示在運行時可靠地編譯到支持的 CPU 架構上的最佳矢量硬件指令的矢量計算。
2. 347: Enable C++14 Language Features
允許在 JDK 底層的C++源代碼中使用C++14的新語言特性,並且提供了在HotSpot虛擬機代碼中,哪些代碼使用了這些新特性的指南。
3. 357: Migrate from Mercurial to Git
將 OpenJDK 社區的源代碼存儲庫從 Mercurial 遷移到 Git。
4. 369: Migrate to GitHub
在 GitHub 上託管 OpenJDK 社區的 Git 存儲庫。
GitHub 是世界流行的Git代碼託管平臺。在國內,託管代碼推薦Gitee哦。
5. 376: ZGC: Concurrent Thread-Stack Processing
ZGC 最早是在 JDK 11 中集成進來的,在 JDK 15 中正式轉正。
這個版本則是為了讓 ZGC 支持併發棧處理,解決了最後一個重大瓶頸,把 ZGC 中的線程棧處理從安全點移到了併發階段。並且還提供了一種機制,使得其他 HotSpot 子系統可以通過該機制延遲處理線程棧。
6. 380: Unix-Domain Socket Channels
UNIX 域套接字通道,為 java.nio.channels 包中的套接字通道和服務端套接字通道 APIs 增加 Unix 域套接字通道所有特性支持。
UNIX 域套接字主要用於同一主機上的進程間通信(IPC),大部分方面與 TCP/IP套接字類似,不同的是 UNIX 域套接字是通過文件系統路徑名尋址,而不是通過 IP 地址和端口號。
7. 386: Alpine Linux Port
在 x64 和 AArch64 平臺體系結構上,將 JDK 移植到 Alpine Linux 以及使用 musl 作為其主要 C 語言庫的其他 Linux 發行版中。
8. 387: Elastic Metaspace
彈性的元空間,可以幫助 HotSpot 虛擬機,將元空間中未使用的 class 元數據內存更及時地返回給操作系統,以減少元空間的內存佔用空間。
另外,還簡化了元空間的代碼,以降低維護成本。
9. 388: Windows/AArch64 Port
將 JDK 移植到 Windows/ AArch64 平臺系列。
10. 389: Foreign Linker API (孵化)
引入了一個新的 API,該 API 提供了對本地 native 代碼的靜態類型訪問支持。
11. 390: Warnings for Value-Based Classes
基於值的類的警告,將基礎類型包裝類指定為基於值的類,廢除其構造函數以進行刪除,從而提示新的棄用警告。並且提供了在任何基於值的類的實例上不正常進行同步的警告。
12. 392: Packaging Tool
提供了 jpackage 打包工具,可用於打包獨立的 Java 應用程序。
jpackage 打包工具是在 JDK 14 中首次作為孵化工具引入的新特性,到了 JDK 15 它仍然還在孵化中,現在它終於轉正了。
13. 393: Foreign-Memory Access API (三次孵化)
該 API 允許 Java 應用程序安全有效地訪問 Java 堆之外的外部內存。
這個最早在 JDK 14 中成為孵化特性,JDK 15/ JDK 16 中繼續二、三次孵化並對其 API 有了一些更新,這個可以在 JDK 17 中好好期待一下轉正。
14. 394: Pattern Matching for instanceof
模式匹配 for instanceof,相當於是增強的 instanceof,在 JDK 14 中首次成為預覽特性,在 JDK 16 中正式轉正。
模式匹配的到來將使得 instanceof 變得更簡潔、更安全,為什麼這麼說,請看下面的示例。
Java 14 之前用法:
if (obj instanceof String) {
String s = (String) obj;
// 使用s
}
Java 14之後的用法:
if (obj instanceof String s) {
// 使用s
}
15. 395: Records
簡單來說,Records 就是一種新的語法糖,目的還是為了簡化代碼,在 JDK 14 中首次成為預覽特性,在 JDK 16 中正式轉正。
Records 可以在一定程度上避免低級冗餘的代碼,比如:constructors, getters, equals(), hashCode(), toString() 方法等,相當於 Lombok 的 @Data 註解,但又不能完全替代。
下面來看一個示例:
舊寫法:
class Point {
private final int x;
private final int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
int x() { return x; }
int y() { return y; }
public boolean equals(Object o) {
if (!(o instanceof Point)) return false;
Point other = (Point) o;
return other.x == x && other.y = y;
}
public int hashCode() {
return Objects.hash(x, y);
}
public String toString() {
return String.format("Point[x=%d, y=%d]", x, y);
}
}
新的Records寫法:
record Point(int x, int y) { }
16. 396: Strongly Encapsulate JDK Internals by Default
JDK 內部默認強封裝,JDK 16 開始對 JDK 內部大部分元素默認進行強封裝,sun.misc.Unsafe 之類的關鍵內部 API 除外,從而限制對它們的訪問。
此外,用戶仍然可以選擇自 JDK 9 以來的默認的寬鬆的強封裝,這樣可以幫助用戶毫不費力地升級到未來的 Java 版本。
17. 397: Sealed Classes (二次預覽)
封閉類(二次預覽),可以是封閉類和或者封閉接口,用來增強 Java 編程語言,防止其他類或接口擴展或實現它們。
參考引用
https://waylau.com/jdk-15-released/
https://waylau.com/jdk-14-released/