1. 程式人生 > >JDK 16 正式釋出,一次性發布 17 個新特性…不服不行!

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

上一篇:[Java 15 正式釋出, 14 個新特性](https://mp.weixin.qq.com/s/fCwOQJxOYiqlnEZjqiFt2Q) --- ## JDK 16 正式釋出 牛逼啊,JDK 15 剛釋出半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老鐵們,跟上。 **來看下 Oracle Java 支援路線圖:** ![](http://img.javastack.cn/20210317123432.png) 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 中提供的預覽特性:[模式匹配](https://mp.weixin.qq.com/s/Qfni7MQOicfhCOtCMEpaog)和記錄(*[Records](https://mp.weixin.qq.com/s/d5dX1ldc-Wse2PT7ODR9xA)*),經過一年的社群反饋和實際應用,終於在 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) { // ... } ``` 判斷、賦值一步到位,是不是很牛逼?具體這裡就不詳細介紹了,棧長之前有寫過一篇文章,點選[這個連結](https://mp.weixin.qq.com/s/Qfni7MQOicfhCOtCMEpaog)進行閱讀,或者關注公眾號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 類的方式來看下它到底做了什麼: ![](http://img.javastack.cn/20210317170826.png) 看完是不是有點 Lombok 的感覺?具體這裡就不詳細介紹了,棧長之前有寫過一篇文章,點選[這個連結](https://mp.weixin.qq.com/s/d5dX1ldc-Wse2PT7ODR9xA)進行閱讀,或者關注公眾號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 兩者的區別這裡不撰述了,不清楚的請點選[這裡](https://mp.weixin.qq.com/s/FvGwskeFzSyB1n0aPVggAQ)進行檢視。 **寫了大半天,頭髮又在掉了。。。** **老鐵們,點個在看、轉發支援下哦,也歡迎分享給你的更多朋友們~** 關注Java技術棧,持續分享最新、最主流的Java技術~ > 版權申明:本文系公眾號 "Java技術棧" 原創,原創實屬不易,轉載、引用本文內容請註明出處,禁止抄襲、洗稿,請自重,尊重他人勞動成果和知識