JDK 16釋出,新特性一覽

語言: CN / TW / HK

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版本,下載地址如下:

上述版本,如果是個人學習用途,則差異不大。但如果是用於商業用途,則需要仔細看好相關的授權。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 程式語言,防止其他類或介面擴充套件或實現它們。

參考引用