JDK 16 正式釋出,一次性發布 17 個新特性…不服不行!

Java技術棧發表於2021-03-26

上一篇:Java 15 正式釋出, 14 個新特性


JDK 16 正式釋出

牛逼啊,JDK 15 剛釋出半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老鐵們,跟上。

來看下 Oracle Java 支援路線圖:

Oracle 繼續保持版本半年一發的節奏。。。

試問:你還能追上 JDK 的釋出速度嗎??

可以看到,JDK 16 也不是一個長期支援的版本,只支援 6 個月到 2021 年 9 月,上一個長期支援版本還是 JDK 11,下一個長期支援版本是 JDK 17,還有半年也要釋出了。

所以千萬不要把 JDK 16(非長期支援版本)用於生產,大家瞭解一下就好。

JDK 16 新特性一覽

ID JEP Feature
1 394 Pattern Matching for instanceof
2 395 Records
3 392 Packaging Tool
4 387 Elastic Metaspace
5 376 ZGC: Concurrent Thread-Stack Processing
6 380 UNIX-Domain Socket Channels
7 396 Strongly Encapsulate JDK Internals by Default
8 390 Warnings for Value-Based Classes
9 338 Vector API (Incubator)
10 389 Foreign Linker API (Incubator)
11 393 Foreign-Memory Access API (Third Incubator)
12 397 Sealed Classes (Second Preview)
13 347 Enable C++14 Language Features (in the JDK source code)
14 357 Migrate from Mercurial to Git
15 369 Migrate to GitHub
16 386 Alpine Linux Port
17 388 Windows/Aarch64 Port

JDK 16 這個版本提供了 17 個增強功能,包括全新的 Java 語言改進,工具和記憶體管理,以及還有一些孵化和預覽特性,有了這些新功能,Java 會進一步提高開發人員的生產力。

值得關注的變化是,JDK 14 中提供的預覽特性:模式匹配和記錄(Records),經過一年的社群反饋和實際應用,終於在 JDK 16 中完成最終落地了。

另外,Oracle 還為 Java SE 訂閱服務中免費提供 GraalVM 企業版服務,GraalVM 可以幫助提高應用程式的效能並減少資源消耗,尤其是在微服務和雲原生架構中。

JDK 16 新特性詳細介紹

下面是 JDK 16 中的 17 個新特性詳細介紹。

394:Pattern Matching for instanceof

模式匹配 for instanceof,相當於是增強的 instanceof,在 JDK 14 中首次成為預覽特性,在 JDK 16 中正式轉正。

模式匹配的到來將使得 instanceof 變得更簡潔、更安全,為什麼這麼說,請看下面的示例。

正常的 instanceof 寫法:

if (object instanceof Kid) {
  Kid kid = (Kid) object;
  // ...
} else if (object instanceof Kiddle) {
  Kid kid = (Kid) object;
  // ...
}

模式匹配的 instanceof 寫法:

if (object instanceof Kid kid) {
  // ...
} else if (object instanceof Kiddle kiddle) {
  // ...
}

判斷、賦值一步到位,是不是很牛逼?具體這裡就不詳細介紹了,棧長之前有寫過一篇文章,點選這個連結進行閱讀,或者關注公眾號Java技術棧,回覆 "java " 進行閱讀。

395:Records

簡單來說,Records 就是一種新的語法糖,目的還是為了簡化程式碼,在 JDK 14 中首次成為預覽特性,在 JDK 16 中正式轉正。

Records 可以在一定程度上避免低階冗餘的程式碼,比如:constructors, getters, equals(), hashCode(), toString() 方法等,相當於 Lombok 的 @Data 註解,但又不能完全替代。

下面來看一個示例:

public record Student(String name, int id, int age) {}

沒錯,一行搞定(public 都可以省略),就是這麼簡單粗暴!!!

我們再通過 IDEA 反編譯 class 類的方式來看下它到底做了什麼:

看完是不是有點 Lombok 的感覺?具體這裡就不詳細介紹了,棧長之前有寫過一篇文章,點選這個連結進行閱讀,或者關注公眾號Java技術棧,回覆 "java " 進行閱讀。

392:Packaging Tool

提供了 jpackage 打包工具,可用於打包獨立的 Java 應用程式。

jpackage 打包工具是在 JDK 14 中首次作為孵化工具引入的新特性,到了 JDK 15 它仍然還在孵化中,現在它終於轉正了。

387:Elastic Metaspace

彈性的元空間,可以幫助 HotSpot 虛擬機器,將元空間中未使用的 class 後設資料記憶體更及時地返回給作業系統,以減少元空間的記憶體佔用空間。

另外,還簡化了元空間的程式碼,以降低維護成本。

376:ZGC: Concurrent Thread-Stack Processing

ZGC 是一種較新的垃圾回收器,指在解決 HotSpot 虛擬機器中的 GC 停頓及可伸縮問題。

ZGC 最早是在 JDK 11 中整合進來的,在 JDK 15 中正式轉正。

這個版本則是為了讓 ZGC 支援併發棧處理,解決了最後一個重大瓶頸,把 ZGC 中的執行緒棧處理從安全點移到了併發階段。並且還提供了一種機制,使得其他 HotSpot 子系統可以通過該機制延遲處理執行緒棧。

380:UNIX-Domain Socket Channels

UNIX 域套接字通道,為 java.nio.channels 包中的套接字通道和服務端套接字通道 APIs 增加 Unix 域套接字通道所有特性支援。

UNIX 域套接字主要用於同一主機上的程式間通訊(IPC),大部分方面與 TCP/IP套接字類似,不同的是 UNIX 域套接字是通過檔案系統路徑名定址,而不是通過 IP 地址和埠號。

396:Strongly Encapsulate JDK Internals by Default

JDK 內部預設強封裝,JDK 16 開始對 JDK 內部大部分元素預設進行強封裝,sun.misc.Unsafe 之類的關鍵內部 API 除外,從而限制對它們的訪問。

此外,使用者仍然可以選擇自 JDK 9 以來的預設的寬鬆的強封裝,這樣可以幫助使用者毫不費力地升級到未來的 Java 版本。

390:Warnings for Value-Based Classes

基於值的類的警告,將基礎型別包裝類指定為基於值的類,廢除其建構函式以進行刪除,從而提示新的棄用警告。並且提供了在任何基於值的類的例項上不正常進行同步的警告。

這個是對基本資料型別的包裝類動刀了,只是提供警告,也不用太在意。

338:Vector API (Incubator)

初步看,還以為是集合中的 Vector,原來不是!

Vector API 這是一個新的初始迭代孵化器模組,模組包:jdk.incubator.vector,用於表示在執行時可靠地編譯到支援的 CPU 架構上的最佳向量硬體指令的向量計算。

很高階,搞不懂,後續有時間再研究。

389:Foreign Linker API (Incubator)

引入了一個新的 API,該 API 提供了對本地 native 程式碼的靜態型別訪問支援。

393:Foreign-Memory Access API (Third Incubator)

外部記憶體訪問 API(三次孵化中),引入了一個新的 API,可以幫助 Java 應用程式更安全、有效地訪問 Java 堆之外的外部記憶體。

這個最早在 JDK 14 中成為孵化特性,JDK 15/ JDK 16 中繼續二、三次孵化並對其 API 有了一些更新,這個可以在 JDK 17 中好好期待一下轉正。

397:Sealed Classes (Second Preview)

封閉類(二次預覽),可以是封閉類和或者封閉介面,用來增強 Java 程式語言,防止其他類或介面擴充套件或實現它們。

來看下面這個示例:

public abstract sealed class Student
    permits ZhangSan, LiSi, ZhaoLiu {
    ...
        
}

類 Student 被 sealed 修飾,說明它是一個封閉類,並且只允許指定的 3 個子類繼承。

這個牛逼啊,有了這個特性,意味著以後不是你想繼承就繼承,想實現就實現了,你得經過允許才行,這個也可以在 JDK 17 中好好期待一下轉正。

347:Enable C++14 Language Features (in the JDK source code)

允許在 JDK 底層的 C ++ 原始碼中使用 C ++ 14 的新語言特性,並且提供了在 HotSpot 虛擬機器程式碼中,哪些程式碼使用了這些新特性的指南。

357:Migrate from Mercurial to Git

將 OpenJDK 社群的原始碼儲存庫從 Mercurial(hg)遷移到 Git。

369:Migrate to GitHub

在 GitHub 上託管 OpenJDK 社群的 Git 儲存庫。

386:Alpine Linux Port

在 x64 和 AArch64 平臺體系結構上,將 JDK 移植到 Alpine Linux 以及使用 musl 作為其主要 C 語言庫的其他 Linux 發行版中。

388:Windows/Aarch64 Port

將 JDK 移植到 Windows/ AArch64 平臺系列。

總結

現在的 JDK 真變成了“版本帝”,無力吐槽啊,版本發到了 16,大部分人卻都還在用著 JDK 7/8,甚至 6。不過沒關係,多瞭解一下,多掌握一點新東西,對你來說沒有壞處。

雖然更新很快,但話又說回來,更是因為 Java 這種不斷的更新、優化和創新,才使得 Java 保持著源源活力,Java 仍然是現在最成功、最主流的開發語言之一。

如果說 Java 第二,誰敢稱第一呢?如果你說 PHP,那我 Respect!

最後,本文主要介紹了 JDK/Java 16 的 17 個新特性基本面,後面棧長有時間也會繼續更新一些 JDK 新特性詳細教程,關注公眾號Java技術棧第一時間推送哦。如果你想看歷史 Java 8+ 系列新特性教程,也可以在公眾號選單中進行閱讀。

往期 Java 教程及示例原始碼:

https://github.com/javastacks/javastack

OracleJDK 16 釋出地址:

https://www.oracle.com/java/technologies/javase/16-relnotes.html

OpenJDK 16 釋出地址:

https://openjdk.java.net/projects/jdk/16/

Oracle JDK 16 下載地址:

https://www.oracle.com/java/technologies/javase-downloads.html

OpenJDK 16 下載地址:

https://jdk.java.net/16/

有興趣的可以下載嚐鮮了!!

OracleJDK 和 OpenJDK 兩者的區別這裡不撰述了,不清楚的請點選這裡進行檢視。

寫了大半天,頭髮又在掉了。。。

老鐵們,點個在看、轉發支援下哦,也歡迎分享給你的更多朋友們~

關注Java技術棧,持續分享最新、最主流的Java技術~

版權申明:本文系公眾號 "Java技術棧" 原創,原創實屬不易,轉載、引用本文內容請註明出處,禁止抄襲、洗稿,請自重,尊重他人勞動成果和智慧財產權。

相關文章