我對(duì)JDK15的簡(jiǎn)單理解

一、為什么要了解JDK15?

2020年9月15日,Oracle官方發(fā)布了JDK15版本,及時(shí)關(guān)注官方的更新動(dòng)態(tài),可以讓我們?cè)谌粘i_(kāi)發(fā)中更合理的選擇更加優(yōu)秀的工具方法,避免使用一些過(guò)時(shí)的或一些即將被刪除類(lèi)和方法,保障程序的健壯性、穩(wěn)定性、可移植性。

二、JDK15都為我們帶來(lái)了哪些東西?

JEP 339: Edwards-Curve 數(shù)字簽名算法(EdDSA)
JEP 360: 密封類(lèi)(預(yù)覽)
JEP 371: 隱藏類(lèi)
JEP 372: 刪除Nashorn JavaScript引擎
JEP 373: 重新實(shí)現(xiàn)舊版DatagramSocket API
JEP 374: 禁用和棄用偏置鎖定
JEP 375: instanceof的模式匹配(第二預(yù)覽)
JEP 377: ZGC:可擴(kuò)展的低延遲垃圾收集器
JEP 378: 文字塊
JEP 379: Shenandoah:低暫停時(shí)間的垃圾收集器
JEP 381: 刪除Solaris和SPARC端口
JEP 383: 外部存儲(chǔ)器訪(fǎng)問(wèn)API(第二個(gè)孵化器)
JEP 384: Records(第二預(yù)覽)
JEP 385: 棄用RMI激活以進(jìn)行刪除
JEP:JDK Enhancement Proposals ,JDK 特性的新增和修改建議。

三、具體說(shuō)一說(shuō)JDK15的特性。

1. JEP 339: Edwards-Curve 數(shù)字簽名算法(EdDSA)
官方描述:

EdDSA是一種現(xiàn)代的橢圓曲線(xiàn)簽名方案,與JDK中的現(xiàn)有簽名方案相比,具有多個(gè)優(yōu)點(diǎn)。

在相同的安全強(qiáng)度下,開(kāi)發(fā)比現(xiàn)有的ECDSA實(shí)現(xiàn)(使用本機(jī)C代碼)更好的性能的EdDSA平臺(tái)無(wú)關(guān)的實(shí)現(xiàn)。例如,在安全性?126位時(shí)使用Curve25519的EdDSA應(yīng)該與在安全性?128位時(shí)使用曲線(xiàn)secp256r1的ECDSA一樣快。
假設(shè)平臺(tái)在恒定時(shí)間內(nèi)執(zhí)行64位整數(shù)加/乘,請(qǐng)確保時(shí)序與秘密無(wú)關(guān)。另外,該實(shí)現(xiàn)將不會(huì)基于秘密分支。這些屬性對(duì)于防止側(cè)通道攻擊非常有用。
簡(jiǎn)而言之:

Edwards-Curve 數(shù)字簽名算法(EdDSA)實(shí)現(xiàn)加密簽名功能。且比現(xiàn)有的JDK 中的簽名安全性和性能更高。

2. JEP 360: 密封類(lèi)(預(yù)覽)
官方描述:

通過(guò)密封的類(lèi)和接口增強(qiáng)Java編程語(yǔ)言。密封的類(lèi)和接口限制可以擴(kuò)展或?qū)崿F(xiàn)它們的其他類(lèi)或接口。通過(guò)將sealed修飾符應(yīng)用于其聲明來(lái)密封類(lèi)。然后,在anyextends和implements子句之后,該permits子句指定允許擴(kuò)展密封類(lèi)的類(lèi)。

簡(jiǎn)而言之:

限定接口的實(shí)現(xiàn)或子類(lèi),不是所有的類(lèi)都能繼承此類(lèi)或?qū)崿F(xiàn)此類(lèi)。

注意:

sealed:隱含子類(lèi) permits : 許可證
non-sealed:隱含非受限子類(lèi)
final:隱含無(wú)子類(lèi)
每個(gè)允許的子類(lèi)都只能使用修飾符 final ,sealed和non-sealed中的一個(gè),且三者互斥。
代碼實(shí)現(xiàn):

 1 // 創(chuàng)建Person 密封類(lèi)
 2 public abstract sealed class Person permits Student, Teacher, Doctor{
 3 
 4 }
 5 
 6 // 學(xué)生類(lèi)繼承人類(lèi)
 7 non-sealed class Student extends Person{ }
 8 
 9 // 老師類(lèi)繼承人類(lèi)
10 final class Teacher extends Person{ }
11 
12 // 醫(yī)生類(lèi)繼承人類(lèi)
13 sealed class Doctor extends Person permits OutpDoctor, InpatDoctor{ }
14 
15 // 門(mén)診醫(yī)生繼承人類(lèi)
16 final class OutpDoctor extends Doctor{ }
17 
18 // 住院醫(yī)生繼承人類(lèi)
19 non-sealed class InpatDoctor extends Doctor{ }
1 // 方法類(lèi)型描述
2 public sealed interface MethodTypeDesc permits DynamicConstantDesc, MethodTypeDescImpl {}
3 
4 // 方法類(lèi)型描述實(shí)現(xiàn)
5 final class MethodTypeDescImpl implements MethodTypeDesc { }
6 
7 // 動(dòng)態(tài)約束描述
8 non-sealed class DynamicConstantDesc implements MethodTypeDesc {}

3. JEP 371: 隱藏類(lèi)
官方描述:

隱藏類(lèi)是其他類(lèi)的字節(jié)碼不能直接使用的類(lèi)。隱藏類(lèi)適用于在運(yùn)行時(shí)生成類(lèi)并通過(guò)反射間接使用它們的框架。隱藏類(lèi)可以定義為訪(fǎng)問(wèn)控制嵌套的成員,并且可以獨(dú)立于其他類(lèi)進(jìn)行卸載。

簡(jiǎn)而言之:

隱藏類(lèi)的超類(lèi)型是由類(lèi)加載器創(chuàng)建的,但隱藏類(lèi)本身的創(chuàng)建并不涉及任何類(lèi)加載器。所以可以方便的進(jìn)行卸載且不用考慮安全問(wèn)題,并且可以減少程序的內(nèi)存占用。

4. JEP 372: 刪除Nashorn JavaScript引擎
官方描述:

隨著ECMAScript語(yǔ)言構(gòu)造以及API的快速適應(yīng)和修改,我們發(fā)現(xiàn)Nashorn難以維護(hù)。官方?jīng)Q定刪除Nashorn JavaScript腳本引擎和API,以及該jjs 工具。

兩個(gè)JDK模塊將被永久刪除:

jdk.scripting.nashorn-包含jdk.nashorn.api.scripting和 jdk.nashorn.api.tree軟件包。
jdk.scripting.nashorn.shell-包含jjs工具。
5. JEP 373: 重新實(shí)現(xiàn)舊版DatagramSocket API(套接字)
官方描述:

用更易于維護(hù)和調(diào)試的更簡(jiǎn)單,更現(xiàn)代的實(shí)現(xiàn)來(lái)替換java.net.DatagramSocket和java.net.MulticastSocketAPI的基礎(chǔ)實(shí)現(xiàn)。新的實(shí)現(xiàn)將很容易適應(yīng)虛擬線(xiàn)程的工作,當(dāng)前正在Project Loom中進(jìn)行探索。

改動(dòng)原因:

java.net.DatagramSocket和java.net.MulticastSocketAPI的代碼庫(kù)及其基礎(chǔ)實(shí)現(xiàn)很舊且脆弱:

實(shí)現(xiàn)可以追溯到JDK 1.0。它們是傳統(tǒng)Java和C代碼的混合,難以維護(hù)和調(diào)試。

的實(shí)現(xiàn)MulticastSocket尤其成問(wèn)題,因?yàn)樗梢宰匪莸絀Pv6仍處于開(kāi)發(fā)階段。許多基本的本機(jī)實(shí)現(xiàn)都嘗試以難以維護(hù)的方式協(xié)調(diào)IPv4和IPv6。

該實(shí)現(xiàn)還存在一些并發(fā)問(wèn)題(例如,異步關(guān)閉),需要進(jìn)行大修才能正確解決。

此外,在駐留而不是阻塞系統(tǒng)調(diào)用中底層內(nèi)核線(xiàn)程的虛擬線(xiàn)程的情況下,當(dāng)前實(shí)現(xiàn)不適合此目的。隨著基于數(shù)據(jù)報(bào)的傳輸再次獲得牽引力(例如 QUIC),需要更簡(jiǎn)單,更可維護(hù)的實(shí)現(xiàn)。

6.JEP 374: 禁用和棄用偏置鎖定
官方描述:

在JDK 15之前,始終啟用并提供偏置鎖定。使用此JEP,除非 -XX:+UseBiasedLocking 在命令行上設(shè)置,否則在啟動(dòng)HotSpot時(shí)將不再啟用偏置鎖定。

改動(dòng)原因:

確定是否需要繼續(xù)支持偏向鎖定的傳統(tǒng)同步優(yōu)化,這是維護(hù)成本很高的方法。有偏見(jiàn)的鎖定會(huì)帶來(lái)爭(zhēng)用時(shí)需要進(jìn)行昂貴的撤銷(xiāo)操作的代價(jià)。

7.JEP 375: instanceof的模式匹配(第二預(yù)覽)
官方描述:

通過(guò)為操作員提供模式匹配來(lái)增強(qiáng)Java編程語(yǔ)言instanceof。模式匹配使程序中的通用邏輯(即從對(duì)象中有條件地提取組件)得以更簡(jiǎn)潔,更安全地表示。

簡(jiǎn)而言之:

可以使我們的代碼更加簡(jiǎn)潔。

代碼示例:

 1     public static void main(String[] args) {
 2         Object str = "模式匹配";
 3         // 模式匹配
 4         // 綁定變量s的作用域在&&運(yùn)算符的右側(cè)以及true塊中、綁定變量s不在||右側(cè)的范圍內(nèi)
 5 //        if(str instanceof String s && s.length() > 0 ){
 6         if(str instanceof String s){
 7             System.out.println(s);
 8         }else {
 9             // s不能作用于此處
10         // System.out.printf(s);
11         }
12     }

8. JEP 377: ZGC:可擴(kuò)展的低延遲垃圾收集器(轉(zhuǎn)正)
官方描述:

對(duì)ZGC的測(cè)試表明它是穩(wěn)定的,并且在撰寫(xiě)本文時(shí),我們已經(jīng)有幾個(gè)月沒(méi)有收到針對(duì)ZGC的新錯(cuò)誤了。借助ZGC如今擁有的穩(wěn)定性,功能集和平臺(tái)支持,是時(shí)候刪除其實(shí)驗(yàn)狀態(tài)并使其成為產(chǎn)品功能了。

今天,可以通過(guò)-XX:+UnlockExperimentalVMOptions -XX:+UseZGC命令行選項(xiàng)啟用ZGC 。使ZGC成為產(chǎn)品(非實(shí)驗(yàn)性)功能意味著-XX:+UnlockExperimentalVMOptions不再需要該選件。

該JEP不建議更改默認(rèn)GC,該默認(rèn)GC仍為G1。

簡(jiǎn)而言之:

ZGC垃圾收集器在JDK15成為正式版,我們可以通過(guò)-XX:+UseZGC命令行選項(xiàng)啟用ZGC,但是需要注意的是默認(rèn)的垃圾收集器仍然是G1。

9. JEP 378: 文字塊(轉(zhuǎn)正)
官方描述:

將文本塊添加到Java語(yǔ)言。文本塊是多行字符串文字,它避免了大多數(shù)轉(zhuǎn)義序列的需要,以一種可預(yù)測(cè)的方式自動(dòng)設(shè)置字符串的格式,并在需要時(shí)使開(kāi)發(fā)人員可以控制格式。

解決了在Java中,在字符串文字中嵌入HTML,XML,SQL或JSON片段"..."通常需要先進(jìn)行轉(zhuǎn)義和串聯(lián)的大量編輯,然后才能編譯包含該片段的代碼。該代碼段通常難以閱讀且難以維護(hù)的問(wèn)題。

代碼示例:

 1 public static void main(String[] args) {
 2         String html = "<html>\n" +
 3                 "    <body>\n" +
 4                 "        <p>Hello, world</p>\n" +
 5                 "    </body>\n" +
 6                 "</html>\n";
 7 
 8         String htmlText = """
 9            <html>
10                <body>
11                    <p>Hello, world</p>
12                </body>
13            </html>
14            """;
15 
16         System.out.println("html長(zhǎng)度" + html.length());
17         System.out.println("htmlText長(zhǎng)度" + htmlText.length());
18 
19         String query = "SELECT \"EMP_ID\", \"LAST_NAME\" FROM \"EMPLOYEE_TB\"\n" +
20                 "WHERE \"CITY\" = 'INDIANAPOLIS'\n" +
21                 "ORDER BY \"EMP_ID\", \"LAST_NAME\";\n";
22 
23         String queryText = """
24             SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"
25             WHERE "CITY" = 'INDIANAPOLIS'
26             ORDER BY "EMP_ID", "LAST_NAME";
27             """;
28 
29         System.out.println("query長(zhǎng)度" + query.length());
30         System.out.println("queryText長(zhǎng)度" + queryText.length());
31 
32         // \:取消換行操作
33         // \s:標(biāo)識(shí)一個(gè)空格
34         String sql1 = """
35             SELECT id, name, age \
36             FROM person\s\
37             WHERE id > 4 \
38             ORDER BY age DESC
39             """;
40 
41         String sql2 = "SELECT id, name, age FROM person WHERE id > 4 ORDER BY age DESC";
42 
43     }

錯(cuò)誤代碼示例:

 1 String a = """""";   // no line terminator after opening delimiter
 2 
 3 String b = """ """;  // no line terminator after opening delimiter
 4 
 5 String c = """
 6            ";        // no closing delimiter (text block continues to EOF)
 7 
 8 String d = """
 9            abc \ def
10            """;      // unescaped backslash (see below for escape processing)

注意:

文本塊:
"""
line 1
line 2
line 3
"""

等效于字符串文字:
"line 1\nline 2\nline 3\n"

或字符串文字的串聯(lián):
"line 1\n" +
"line 2\n" +
"line 3\n"

---------------------------------------------------------
"""
line 1
line 2
line 3"""

等效于字符串文字:
"line 1\nline 2\nline 3"

10. JEP 379: Shenandoah:低暫停時(shí)間的垃圾收集器(轉(zhuǎn)正)
官方描述:

將Shenandoah垃圾收集器從實(shí)驗(yàn)功能更改為產(chǎn)品功能。

在JDK 12和更高版本中,通過(guò)-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC選項(xiàng)啟用了Shenandoah 。將Shenandoah成為產(chǎn)品功能意味著-XX:+UnlockExperimentalVMOptions不再需要。

簡(jiǎn)而言之:

Shenandoah垃圾收集器功能轉(zhuǎn)正,可以通過(guò)-XX:+UseShenandoahGC直接使用,Shenandoah 的暫停時(shí)間與堆大小無(wú)關(guān)。

11. JEP 381: 刪除Solaris和SPARC端口
官方描述:

刪除所有特定于Solaris操作系統(tǒng)的源代碼。

刪除所有特定于SPARC體系結(jié)構(gòu)的源代碼。

更新文檔和源代碼注釋以用于將來(lái)的版本。

改動(dòng)原因:

當(dāng)前正在開(kāi)發(fā)的許多項(xiàng)目和功能(例如Valhalla,Loom和Panama)都需要對(duì)CPU體系結(jié)構(gòu)和特定于操作系統(tǒng)的代碼進(jìn)行重大更改。放棄對(duì)Solaris和SPARC端口的支持將使OpenJDK社區(qū)中的貢獻(xiàn)者能夠加速新功能的開(kāi)發(fā),這些新功能將推動(dòng)平臺(tái)向前發(fā)展。

12.JEP 383: 外部存儲(chǔ)器訪(fǎng)問(wèn)API(第二個(gè)孵化器)
官方描述:

引入一個(gè)API,以允許Java程序安全有效地訪(fǎng)問(wèn)Java堆之外的外部?jī)?nèi)存。

在Java 14作為孵化API,在JDK15中第二次孵化。

以jdk.incubator.foreign相同的名稱(chēng)包形式提供了外部存儲(chǔ)器訪(fǎng)問(wèn)API ;它引入了三個(gè)主要抽象:MemorySegment,MemoryAddress和MemoryLayout。

13.JEP 384: Records(第二預(yù)覽)
官方描述:

使用records增強(qiáng)Java編程語(yǔ)言,record 是充當(dāng)不可變數(shù)據(jù)的透明載體的類(lèi)。記錄可以看作是名義元組。

設(shè)計(jì)一個(gè)表達(dá)簡(jiǎn)單值集合的面向?qū)ο蟮臉?gòu)造。
幫助程序員專(zhuān)注于對(duì)不可變數(shù)據(jù)進(jìn)行建模,而不是對(duì)可擴(kuò)展行為進(jìn)行建模。
自動(dòng)實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的方法,例如equals和訪(fǎng)問(wèn)器。
保留長(zhǎng)期的Java原則,例如標(biāo)稱(chēng)類(lèi)型和遷移兼容性
官方示例:

例如,先前聲明的記錄record Point(int x, int y) { }-將被編譯為:

record Point(int x, int y) {
    // Implicitly declared fields
    private final int x;
    private final int y;

    // Other implicit declarations elided ...

    // Implicitly declared canonical constructor
    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

簡(jiǎn)而言之:

似于lombok,主要目的是為了簡(jiǎn)化作用,不用再寫(xiě)構(gòu)造方法、equals,hashCode,toString等方法。

代碼示例:

 1 public record Student(String name,int age) {
 2 }
 3 
 4 public class Main {
 5     public static void main(String[] args) {
 6         Student student = new Student("張三",20);
 7         System.out.println(student);
 8         System.out.println(student.name());
 9         System.out.println(student.age());
10     }
11 }

14.JEP 385: 棄用RMI激活以進(jìn)行刪除
官方描述:

棄用RMI激活 機(jī)制以便將來(lái)刪除。RMI激活是RMI的過(guò)時(shí)部分,自Java 8開(kāi)始,RMI激活是可選的。不會(huì)棄用RMI的其他部分。

改動(dòng)原因:

分布式系統(tǒng)至少在過(guò)去十年中一直基于Web技術(shù)。Web服務(wù)領(lǐng)域已經(jīng)解決了有關(guān)穿越防火墻,篩選請(qǐng)求,身份驗(yàn)證和安全性的問(wèn)題。延遲實(shí)例化資源由負(fù)載平衡器,業(yè)務(wù)流程和容器處理。這些機(jī)制在分布式系統(tǒng)的RMI激活模型中均不存在。

RMI激活的使用量幾乎消失了。沒(méi)有證據(jù)表明有任何新的應(yīng)用程序被編寫(xiě)為使用RMI激活,并且有證據(jù)表明很少有現(xiàn)有應(yīng)用程序使用RMI激活。對(duì)各種開(kāi)放源代碼庫(kù)的搜索幾乎沒(méi)有發(fā)現(xiàn)任何與激活相關(guān)的API。

間而言之:

RMI激活的功能使用極少,Web服務(wù)有更優(yōu)秀的問(wèn)題解決方案,RMI激活增加了維護(hù)的費(fèi)用。

四、總結(jié)

總的來(lái)說(shuō),JDK15新功能不多,可以根據(jù)自己的實(shí)際需要,根據(jù)JDK版本功能走向來(lái)選擇合理的功能。

image

最新2020整理收集的一些高頻面試題(都整理成文檔),有很多干貨,包含mysql,netty,spring,線(xiàn)程,spring cloud、jvm、源碼、算法等詳細(xì)講解,也有詳細(xì)的學(xué)習(xí)規(guī)劃圖,面試題整理等,需要獲取這些內(nèi)容的朋友請(qǐng)加Q君樣:909038429
/./*歡迎加入java交流Q君樣:909038429一起吹水聊天

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 2020年9月15日J(rèn)DK15發(fā)布,這也是一個(gè)短期支持的過(guò)渡版本,只會(huì)維護(hù)到明年三月JDK16發(fā)布。 官方文檔ht...
    故里學(xué)Java閱讀 465評(píng)論 0 1
  • Java語(yǔ)言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的...
    go4it閱讀 1,500評(píng)論 0 1
  • 推薦指數(shù): 6.0 書(shū)籍主旨關(guān)鍵詞:特權(quán)、焦點(diǎn)、注意力、語(yǔ)言聯(lián)想、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會(huì)...
    Jenaral閱讀 6,036評(píng)論 0 5
  • 昨天,在回家的路上,坐在車(chē)?yán)镉圃沼圃盏乜粗摹度龉衬墓适隆?,我被里面的?nèi)容深深吸引住了,盡管上學(xué)時(shí)...
    夜闌曉語(yǔ)閱讀 3,958評(píng)論 2 9
  • 一。匹配。 判斷一個(gè)字符串是否符合我們制定的規(guī)則? 二…捕獲 字符串中符合我們正則表達(dá)式,規(guī)則的,內(nèi)容捕獲到。 三...
    時(shí)修七年閱讀 1,070評(píng)論 2 0

友情鏈接更多精彩內(nèi)容