JDK 16發佈,新特性一覽

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 編程語言,防止其他類或接口擴展或實現它們。

參考引用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章