Java 15 正式發佈, 14 個新特性,刷新你的認知!!

JDK 15 2020/09/15 如期而至!html

這個時間牛逼啊,和蘋果發佈會同天?java

OracleJDK 15 發佈地址:git

https://www.oracle.com/java/technologies/javase/15all-relnotes.html算法

OpenJDK 15 發佈地址:編程

https://openjdk.java.net/projects/jdk/15/安全

OracleJDK 和 OpenJDK 二者的區別這裏不撰述了,不清楚的請點擊這裏進行查看。oracle

如今的 JDK 真變成了「版本帝」,無力吐槽啊,版本發到 15,大部分人卻都還在用着 JDK 7/8,甚至 6。不過不要緊,多瞭解一下,多掌握一點新東西,對你來講沒有壞處。框架

新特性編程語言

JDK 15 新特性一覽表:工具

IDJEPFeature1339Edwards-Curve Digital Signature Algorithm (EdDSA)2360Sealed Classes (Preview)3371Hidden Classes4372Remove the Nashorn JavaScript Engine5373Reimplement the Legacy DatagramSocket API6374Disable and Deprecate Biased Locking7375Pattern Matching for instanceof (Second Preview)8377ZGC: A Scalable Low-Latency Garbage Collector9378Text Blocks10379Shenandoah: A Low-Pause-Time Garbage Collector11381Remove the Solaris and SPARC Ports12383Foreign-Memory Access API (Second Incubator)13384Records (Second Preview)14385Deprecate RMI Activation for Removal

JDK 15 一次發佈了 14 個新特性,下面帶你們來解讀下這些新特性!

339:Edwards-Curve Digital Signature Algorithm (EdDSA)

Edwards-Curve 數據簽名算法(EdDSA),一種根據 RFC 8032 規範所描述的 Edwards-Curve 數字簽名算法(EdDSA)實現加密簽名,實現了一種 RFC 8032 標準化方案,但它不能代替 ECDSA。

EdDSA 是一種現代的橢圓曲線簽名方案,與 JDK 中現有的簽名方案相比,它有不少優點。

360:Sealed Classes (Preview)

封閉類(預覽特性),能夠是封閉類和或者封閉接口,用來加強 Java 編程語言,防止其餘類或接口擴展或實現它們。

這個牛逼啊,有了這個特性,意味着之後不是你想繼承就繼承,想實現就實現了,你得通過容許才行。

來看這個示例:

public abstract sealed class Student

permits ZhangSan, LiSi, ZhaoLiu {

...

}

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

371:Hidden Classes

隱藏類,這一看也是個頗有意思的特性。

隱藏類是爲框架(frameworks)所設計的,隱藏類不能直接被其餘類的字節碼使用,只能在運行時生成類並經過反射間接使用它們。

372:Remove the Nashorn JavaScript Engine

移除了 Nashorn JavaScript 腳本引擎、APIs,以及 jjs 工具。這些早在 JDK 11 中就已經被標記爲 deprecated 了,JDK 15 被移除就很正常了。

Nashorn 是 JDK 1.8 引入的一個 JavaScript 腳本引擎,用來取代 Rhino 腳本引擎。Nashorn 是 ECMAScript-262 5.1 的完整實現,加強了 Java 和 JavaScript 的兼容性,而且大大提高了性能。

爲何要移除?

官方的描述是,隨着 ECMAScript 腳本語言的結構、API 的改編速度愈來愈快,維護Nashorn 太有挑戰性了,因此……。

373:Reimplement the Legacy DatagramSocket API

從新實現了老的 DatagramSocket API 接口,更改了 java.net.DatagramSocket 和 java.net.MulticastSocket 爲更加簡單、現代化的底層實現,更易於維護和調試。

新的底層實現將很容易使用虛擬線程,目前正在 Loom 項目中進行探索。這也是 JEP 353 的後續更新版本,JEP 353 已經從新實現了 Socket API。

374:Disable and Deprecate Biased Locking

準備禁用和廢除偏向鎖,在 JDK 15 中,默認狀況下禁用偏向鎖,並棄用全部相關的命令行選項。

後面再肯定是否須要繼續支持偏向鎖,國爲維護這種鎖同步優化的成本過高了。

375:Pattern Matching for instanceof (Second Preview)

模式匹配(第二次預覽),第一次預覽是 JDK 14 中提出來的

Java 14 以前:

if (object instanceof Kid) {

Kid kid = (Kid) object;

// ...

} else if (object instanceof Kiddle) {

Kid kid = (Kid) object;

// ...

}

Java 14+:

if (object instanceof Kid kid) {

// ...

} else if (object instanceof Kiddle kiddle) {

// ...

}

Java 15 並無對此特性進行調整,繼續預覽特性,只是爲了收集更多的用戶反饋,可能還不成熟吧。

377:ZGC: A Scalable Low-Latency Garbage Collector

ZGC:一個可伸縮、低延遲的垃圾回收器。

ZGC 最先是在 JDK 11 中集成進來的,JDK 15 只是將 ZGC 垃圾收集器從預覽特性變動爲正式特性而已,沒錯,轉正了。

這個 JEP 不會更改默認的 GC,默認仍然是 G1。

378:Text Blocks

文本塊,是一個多行字符串,它能夠避免使用大多數轉義符號,自動以可預測的方式格式化字符串,並讓開發人員在須要時能夠控制格式。

文本塊最先準備在 JDK 12 添加的,但最終撤消了,而後在 JDK 13 中做爲預覽特性進行了添加,而後又在 JDK 14 中再次預覽,在 JDK 15 中,文本塊終於轉正,暫再也不作進一步的更改。

來看下這個示例你就懂了:

Java 13 以前:

String html = "<html>\n" +

" <body>\n" +

" <p>Hi, 啥啥啥</p>\n" +

" <p>歡迎關注,分享更多幹貨</p>\n" +

" </body>\n" +

"</html>\n";

Java 13+:

String html = """

<html>

<body>

<p>Hi,啥啥啥</p>

<p>歡迎關注,分享更多幹貨</p>

</body>

</html>

""";

去掉那些無用的換行和拼接,是否是太爽了。。

379:Shenandoah: A Low-Pause-Time Garbage Collector

Shenandoah:一個低停頓時間的垃圾回收器。

Shenandoah 最先是在 JDK 12 中集成進來的,JDK 15 只是將 Shenandoah 垃圾收集器從預覽特性變動爲正式特性而已,沒錯,又是轉正了。

381:Remove the Solaris and SPARC Ports

移除了 Solaris 和 SPARC 端口。

移除了 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 端口的源代碼及構建支持。這些端口在 JDK 14 中就已經被標記爲 deprecated 了,JDK 15 被移除也不奇怪。

383:Foreign-Memory Access API (Second Incubator)

外存訪問 API(二次孵化),能夠容許 Java 應用程序安全有效地訪問 Java 堆以外的外部內存。

這個最先在 JDK 14 中成爲孵化特性,JDK 15 繼續二次孵化並對其 API 有了一些更新。

384:Records (Second Preview)

Records 最先在 JDK 14 中成爲預覽特性,JDK 15 繼續二次預覽。

Records 在某些場合能夠幹掉 Lombok 的存在,能自動生成了類構造器、toString()、hashCode()、equals(),以及相似 getter 的變量訪問方法。

使用方式:

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

實際生成:

 

看完是否是有點 Lombok 的感受?

385:Deprecate RMI Activation for Removal

廢除 RMI 激活,以便在未來進行刪除。

須要說明的是,RMI 激活是 RMI 中一個過期的組件,自 Java 8 以來一直是可選的。

相關文章
相關標籤/搜索