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 教程及示例原始碼:
OracleJDK 16 釋出地址:
https://www.oracle.com/java/technologies/javase/16-relnotes.html
OpenJDK 16 釋出地址:
Oracle JDK 16 下載地址:
https://www.oracle.com/java/technologies/javase-downloads.html
OpenJDK 16 下載地址:
有興趣的可以下載嚐鮮了!!
OracleJDK 和 OpenJDK 兩者的區別這裡不撰述了,不清楚的請點選這裡進行檢視。
寫了大半天,頭髮又在掉了。。。
老鐵們,點個在看、轉發支援下哦,也歡迎分享給你的更多朋友們~
關注Java技術棧,持續分享最新、最主流的Java技術~
版權申明:本文系公眾號 "Java技術棧" 原創,原創實屬不易,轉載、引用本文內容請註明出處,禁止抄襲、洗稿,請自重,尊重他人勞動成果和智慧財產權。