重磅!JDK 17 發(fā)布,Oracle 宣布從 JDK 17 開始正式免費(fèi)。。
JDK 17 正式發(fā)布+免費(fèi)
牛逼啊,JDK 16 剛發(fā)布半年(2021/03/16),JDK 17 又如期而至(2021/09/14),這個(gè)時(shí)間點(diǎn)牛逼啊,蹭蘋果發(fā)布會(huì)的熱度?記得當(dāng)年 JDK 15 的發(fā)布也是同天,巧了。。
雖然 iPhone 13 發(fā)布了,但真的不是 13 香,真沒(méi)什么創(chuàng)新和亮點(diǎn),一如繼往蘋果式擠牙膏,在 13 上真的擠到精髓了,這次我想說(shuō),JDK 17 更香!!
iPhone 13 降價(jià)算啥??JDK 17 直接干到免費(fèi)!!!
Oracle 宣布,從 JDK 17 開始,后面的 JDK 都全部免費(fèi)提供!!!

是的,你沒(méi)有看錯(cuò),Oracle 這次良心了,發(fā)大招了,Java 17+ 可以免費(fèi)使用了,包括商用,更詳細(xì)的條款可以閱讀:
https://www.oracle.com/downloads/licenses/no-fee-license.html
來(lái)看下最新 Oracle Java 支持路線圖:

可以看到,JDK 17 是自 2018 年 JDK 11 后的第二個(gè)長(zhǎng)期支持版本,支持到 2029 年 9 月,好家伙,支持時(shí)間長(zhǎng)達(dá) 8 年,這下可以不用死守 JDK 8 了,JDK 17+ 也可以是一種新的選擇了。。
下一個(gè)第三個(gè)長(zhǎng)期支持版本是 JDK 21,時(shí)間為 2023 年 9 月,這次長(zhǎng)期支持版本發(fā)布計(jì)劃改了,不再是原來(lái)的 3 年一次,而是改成了 2 年一次!
另外,非長(zhǎng)期支持版本還是半年發(fā)一次不變,下一個(gè)非長(zhǎng)期支持版本計(jì)劃在 2022/03 發(fā)布,但注意不要用在生產(chǎn)。
JDK 17 新特性一覽
| ID | 特性 | 說(shuō)明 |
|---|---|---|
| 1 | 306:Restore Always-Strict Floating-Point Semantics | 恢復(fù)始終執(zhí)行嚴(yán)格模式的浮點(diǎn)定義 |
| 2 | 356:Enhanced Pseudo-Random Number Generators | 增強(qiáng)型偽隨機(jī)數(shù)生成器 |
| 3 | 382:New macOS Rendering Pipeline | 新的 macOS 渲染管道 |
| 4 | 391:macOS/AArch64 Port | macOS AArch64 端口 |
| 5 | 398:Deprecate the Applet API for Removal | 棄用 Applet API |
| 6 | 403:Strongly Encapsulate JDK Internals | JDK 內(nèi)部強(qiáng)封裝 |
| 7 | 406:Pattern Matching for switch (Preview) | 為 switch 支持模式匹配 |
| 8 | 407:Remove RMI Activation | 移除 RMI 激活 |
| 9 | 409:Sealed Classes | 密封類 |
| 10 | 410:Remove the Experimental AOT and JIT Compiler | 移除實(shí)驗(yàn)性的 AOT 和 JIT 編譯器 |
| 11 | 411:Deprecate the Security Manager for Removal | 棄用安全管理器 |
| 12 | 412:Foreign Function & Memory API (Incubator) | 外部函數(shù)和內(nèi)存 API(孵化中) |
| 13 | 414:Vector API (Second Incubator) | 矢量 API(二次孵化中) |
| 14 | 415:Context-Specific Deserialization Filters | 上下文特定反序列化過(guò)濾器 |
JDK 17 這個(gè)版本提供了 14 個(gè)增強(qiáng)功能,另外在性能、穩(wěn)定性和安全性上面也得到了大量的提升,以及還有一些孵化和預(yù)覽特性,有了這些新變化,Java 會(huì)進(jìn)一步提高開發(fā)人員的生產(chǎn)力。
JDK 17 新特性詳細(xì)介紹
下面是 JDK 17 中的 14 個(gè)新特性詳細(xì)介紹,分為 5 大類進(jìn)行介紹!
1. 語(yǔ)言增強(qiáng)
409:Sealed Classes
密封類,這個(gè)特性在 JDK 15 中首次成為預(yù)覽特性,在 JDK 16 中進(jìn)行二次預(yù)覽,在 JDK 17 這個(gè)版本中終于正式轉(zhuǎn)正了。
密封類可以用來(lái)增強(qiáng) Java 編程語(yǔ)言,防止其他類或接口擴(kuò)展或?qū)崿F(xiàn)它們。
來(lái)看下面這個(gè)示例:
public abstract sealed class Student
permits ZhangSan, LiSi, ZhaoLiu {
...
}
類 Student 被 sealed 修飾,說(shuō)明它是一個(gè)密封類,并且只允許指定的 3 個(gè)子類繼承。
這個(gè)牛逼啊,有了這個(gè)特性,意味著以后不是你想繼承就繼承,想實(shí)現(xiàn)就實(shí)現(xiàn)了,你得經(jīng)過(guò)允許才行。
2. 預(yù)覽和孵化特性
406:Pattern Matching for switch (Preview)
為 switch 支持模式匹配(預(yù)覽中)
instanceof 模式匹配的概念大家都清楚吧?
這次在 JDK 17 中為 switch 語(yǔ)句支持模式匹配,是個(gè)什么鬼?來(lái)看下面的示例!
老代碼寫法:
static String formatter(Object o) {
String formatted = "unknown";
if (o instanceof Integer i) {
formatted = String.format("int %d", i);
} else if (o instanceof Long l) {
formatted = String.format("long %d", l);
} else if (o instanceof Double d) {
formatted = String.format("double %f", d);
} else if (o instanceof String s) {
formatted = String.format("String %s", s);
}
return formatted;
}
模式匹配新寫法:
static String formatterPatternSwitch(Object o) {
return switch (o) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> o.toString();
};
}
牛逼,直接在 switch 上支持 Object 類型,這就等于同時(shí)支持多種類型,使用模式匹配得到具體類型,大大簡(jiǎn)化了語(yǔ)法量,這個(gè)功能還是挺實(shí)用的,期待轉(zhuǎn)正。
412:Foreign Function & Memory API (Incubator)
外部函數(shù)和內(nèi)存 API(孵化中)
改進(jìn)了 JDK 14 和 JDK 15 引入的 API,通過(guò)有效調(diào)用外部函數(shù)(即 JVM 之外的代碼),以及安全地訪問(wèn)外部?jī)?nèi)存(JVM 之外的內(nèi)存),這些 API 可以調(diào)用本地庫(kù)和處理本地?cái)?shù)據(jù),與 Java 運(yùn)行環(huán)境之外的代碼和數(shù)據(jù)進(jìn)行交互。
414: Vector API (Second Incubator)
矢量 API(二次孵化中)
Vector API 這是一個(gè)新的初始迭代孵化器模塊,模塊包:jdk.incubator.vector,用于表示在運(yùn)行時(shí)可靠地編譯到支持的 CPU 架構(gòu)上的最佳矢量硬件指令的矢量計(jì)算,矢量運(yùn)算可以提供優(yōu)于等效標(biāo)量計(jì)算的性能,并且在機(jī)器學(xué)習(xí)、人工智能和密碼學(xué)等領(lǐng)域非常普遍。
本次增強(qiáng)的 API 允許以一種在運(yùn)行時(shí),可靠地編譯為支持的 CPU 架構(gòu)上的最佳向量指令的方式表達(dá)向量計(jì)算。
3. 核心增強(qiáng)
306:Restore Always-Strict Floating-Point Semantics
恢復(fù)始終執(zhí)行嚴(yán)格模式的浮點(diǎn)定義。
Java 最初只有嚴(yán)格的浮點(diǎn)語(yǔ)義,但從 JDK 1.2 開始,為了適應(yīng)當(dāng)時(shí)硬件架構(gòu)的限制,默認(rèn)情況下允許這些嚴(yán)格語(yǔ)義中的細(xì)微變化,而現(xiàn)在這些都沒(méi)有必要了,已被 JEP 306 刪除。
356:Enhanced Pseudo-Random Number Generators
增強(qiáng)型偽隨機(jī)數(shù)生成器,java.util.random 包更新了,提高了不同 PRNGs(偽隨機(jī)數(shù)生成器)的互操作性,并使基于需求而不是硬編碼特定實(shí)現(xiàn)的算法變得容易。
這次更改包括偽隨機(jī)數(shù)生成器(PRNG)的新的接口類型和實(shí)現(xiàn),包括可跳 PRNGs 和一個(gè)可拆分的 PRNG 算法(LXM),以及全新的 RandomGeneratorFactory 類。
382:New macOS Rendering Pipeline
新的 macOS 渲染管道。
這個(gè)新管道通過(guò)使用新的 Apple Metal API 為 macOS 實(shí)現(xiàn) Java 2D 渲染管道,減少了 JDK 對(duì)已棄用的 Apple OpenGL API 的依賴。
415: Context-Specific Deserialization Filters
上下文特定反序列化過(guò)濾器。
允許應(yīng)用配置 context-specific 和 dynamically-selected 過(guò)濾器,通過(guò)一個(gè) JVM 范圍的過(guò)濾器工廠,用來(lái)為每個(gè)單獨(dú)的反序列化操作選擇一個(gè)過(guò)濾器。
403:Strongly Encapsulate JDK Internals
JDK 內(nèi)部強(qiáng)封裝,它是 JDK 16 中 JEP 396 的延續(xù),JDK 16 開始對(duì) JDK 內(nèi)部大部分元素默認(rèn)進(jìn)行強(qiáng)封裝,sun.misc.Unsafe 之類的關(guān)鍵內(nèi)部 API 除外,從而限制對(duì)它們的訪問(wèn)。
此外,用戶仍然可以選擇自 JDK 9 以來(lái)的默認(rèn)的寬松的強(qiáng)封裝,這樣可以幫助用戶毫不費(fèi)力地升級(jí)到未來(lái)的 Java 版本。
4. 新平臺(tái)支持
391:macOS/AArch64 Port
macOS AArch64 端口,即提供可適用于 macOS 的 JDK 版本,該版本可在基于 Arm 64 的較新的 macOS 系統(tǒng)上本地化運(yùn)行。
5. 棄用和移除項(xiàng)
411:Deprecate the Security Manager for Removal
棄用安全管理器。
安全管理器從 Java 1.0 開始,這些年來(lái)它一直都不是保護(hù) Java 應(yīng)用程序代碼的主要手段,也很少用于保護(hù) Java 服務(wù)器端代碼,所以這個(gè)版本標(biāo)識(shí)為棄用狀態(tài)了,未來(lái)的版本會(huì)進(jìn)行移除。
398:Deprecate the Applet API for Removal
棄用 Applet API。
Applet 是一種運(yùn)行在 Web 瀏覽器內(nèi)的 Java 程序,但 Applet 早就沒(méi)什么鳥用了,現(xiàn)在還有哪款瀏覽器支持 Java Applet 的嗎?在坐的各位估計(jì)都沒(méi)聽過(guò)吧?
407:Remove RMI Activation
移除 RMI 激活。
RMI 激活機(jī)制已于 2020 年 9 月在 JDK 15 中移除了,遠(yuǎn)程方法調(diào)用 (RMI) 激活機(jī)制現(xiàn)也已被移除,需要說(shuō)明的是,RMI 激活是 RMI 中一個(gè)過(guò)時(shí)的組件,自 Java 8 以來(lái)一直是可選的。
410:Remove the Experimental AOT and JIT Compiler
移除實(shí)驗(yàn)性的 AOT 和 JIT 編譯器。
AOT 和 JIT 這兩個(gè)實(shí)驗(yàn)性的編譯器,自從在 JDK 9 中引入以來(lái)幾乎沒(méi)有怎么使用,市面上也出現(xiàn)了更為廣泛使用的替代方案,并且維護(hù)它們所需的工作量很大,所以在 JDK 16 中就已經(jīng)刪除了,本次從 OpenJDK 項(xiàng)目中刪除了源代碼。
JDK 17 都免費(fèi)了,和 OpenJDK 還有區(qū)別?
有的,雖然兩者很接近,但也還是有一點(diǎn)區(qū)別!
1、Oracle JDK 提供了各種安裝程序,還包含更新規(guī)則,而 OpenJDK 只提供了一個(gè)純壓縮包;
2、Usage Logging 僅在 Oracle JDK 中可用;
3、Oracle JDK 要求第三方加密提供程序使用 Java 加密擴(kuò)展(JCE)進(jìn)行簽名,而 OpenJDK 繼續(xù)允許使用未簽名的第三方加密提供程序;
4、java -version 的輸出也是不同的,Oracle JDK 返回 java 并包含 Oracle 特定的標(biāo)識(shí)符,OpenJDK 返回 OpenJDK 并且不包含特定于 Oracle 的標(biāo)識(shí)符;
5、許可證不同,Oracle JDK 17+ 是根據(jù) Oracle 免費(fèi)條款和條件許可發(fā)布的,而 OpenJDK 在 GPLv2wCP 下發(fā)布的;
6、Oracle JDK 源代碼含有 "ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.",其使用受許可條款約束的,而 OpenJDK 源代碼可參考 GPL 許可條款;
以上是兩者最主要的 6 點(diǎn)區(qū)別。
總結(jié)
最后,本文主要介紹了 JDK/Java 17 的 14 個(gè)新特性基本面。
Java 17 發(fā)布了,Oracle 宣布 JDK 17 及之后的版本都免費(fèi)使用,包括商用,爽!!!Oracle 這次真的良心了,或許是趨于某種壓力進(jìn)行免費(fèi)?
Java 確實(shí)是在走下坡路,即使如此,也是老當(dāng)益壯,是現(xiàn)在各大企業(yè)必用的語(yǔ)言之一。
雖然大部分人現(xiàn)在還在用著 JDK 7/8,甚至 6,還在寫著 JDK 5 的語(yǔ)法,現(xiàn)在隨著 JDK 17+ 的免費(fèi),或者在未來(lái)的不久,JDK 8 會(huì)逐漸被替代,JDK 17+ 慢慢走上舞臺(tái)。
OracleJDK 17 發(fā)布地址:
https://www.oracle.com/java/technologies/javase/17-relnotes.html
OpenJDK 17 發(fā)布地址:
http://openjdk.java.net/projects/jdk/17/
Oracle JDK 17 下載地址:
https://www.oracle.com/java/technologies/javase-downloads.html
OpenJDK 17 下載地址:
https://jdk.java.net/17/
有興趣的可以下載嘗鮮了!!
最后,JDK 17+ 開始免費(fèi)了,你們會(huì)考慮用嗎?來(lái)評(píng)論看看!
程序汪資料鏈接
程序汪接的7個(gè)私活都在這里,經(jīng)驗(yàn)整理
Java項(xiàng)目分享 最新整理全集,找項(xiàng)目不累啦 04版
堪稱神級(jí)的Spring Boot手冊(cè),從基礎(chǔ)入門到實(shí)戰(zhàn)進(jìn)階
臥槽!字節(jié)跳動(dòng)《算法中文手冊(cè)》火了,完整版 PDF 開放下載!
臥槽!阿里大佬總結(jié)的《圖解Java》火了,完整版PDF開放下載!
字節(jié)跳動(dòng)總結(jié)的設(shè)計(jì)模式 PDF 火了,完整版開放下載!
歡迎添加程序汪個(gè)人微信 itwang008 進(jìn)粉絲群或圍觀朋友圈
