更新時間:2021-02-01 17:26:20 來源:動力節點 瀏覽1455次
2020/3/17日JDK14正式發版,每一次Java版本的更新都會帶來許多巨大的改變,對J從事Java行業和學習Java技術的人來說都是不可不關注的重大事件。本文我們就帶大家初步認識一下JDK14新特性。
Java 14對應的JSR 389中包含16個JEP,也就是說在JDK14中新增了16個新的特性。
在JDK14中新增了以下16個新特性:
305: instanceof的模式匹配 (預覽)
343: 打包工具 (Incubator)
345: G1的NUMA內存分配優化
349: JFR事件流
352: 非原子性的字節緩沖區映射
358: 友好的空指針異常
359: Records (預覽)
361: Switch表達式 (標準)
362: 棄用Solaris和SPARC端口
363: 移除CMS(Concurrent Mark Sweep)垃圾收集器
364: macOS系統上的ZGC
365: Windows系統上的ZGC
366: 棄用ParallelScavenge + SerialOld GC組合
367: 移除Pack200 Tools和API
368: 文本塊 (第二個預覽版)
370: 外部存儲器API (Incubator)
上述的JDK新特性,有一些是我們之前學習Java中完全不曾見過的,有的則是在原有的基礎之上進行了一些變化。JDK14的新特性不一定都是我們能夠用到的,下面我們重點來講幾個JDK14新特性。
1.instanceof模式匹配
通常情況下我們使用instanceof來探測類的真實類型,如果符合該類型,則可進行強制轉換。
在Java14之前,我們通常的寫法如下:
Object obj = "班級";
if(obj instanceof String){
????String str = (String) obj;
????System.out.println("姓名:" + str);
}
通過java14的新特性,我們可以簡化成如下方式:
Object obj = "班級";
if(obj instanceof String str){
????System.out.println("姓名:" + str);
}
我們可以通過模式匹配簡潔地表達對象,并允許各種語句和表達式對其進行測試。
2.Switch表達式
通常情況下我們通過如下形式使用switch語法:
switch (day) {
????case MONDAY:
????case FRIDAY:
????case SUNDAY:
????????System.out.println(6);
????????break;
????case TUESDAY:
????????System.out.println(7);
????????break;
????case THURSDAY:
????case SATURDAY:
????????System.out.println(8);
????????break;
????case WEDNESDAY:
????????System.out.println(9);
????????break;
}
java14引入了新形式的switch標簽“case L->”,表示如果匹配,則只執行標簽右邊的代碼。switch標簽允許在每種情況下使用逗號分隔多個常量。
switch (day) {
????case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
????case TUESDAY ???????????????-> System.out.println(7);
????case THURSDAY, SATURDAY ????-> System.out.println(8);
????case WEDNESDAY ?????????????-> System.out.println(9);
}
這樣看上去十分簡潔明了。
3.記錄類型(Record Type)的引入
Java 14中記錄類型(Record Type)作為預覽特性被引入。記錄對象允許使用緊湊的語法來聲明類,和枚舉類型一樣,記錄也是類的一種受限形式。
在idea 2020.1中,創建Record與創建類和枚舉一樣,可以在創建時直接選擇對應的類型。
定義一個Record類型如下:
public record Point(int x, int y) {
}
使用Record操作如下:
Point point = new Point(1,3);
System.out.println(point.x());
System.out.println(point.y());
對Record類進行反編譯我們會看到如下內容:
public final class Point extends java.lang.Record {
????private final int x;
????private final int y;
????public Point(int x, int y) { /* compiled code */ }
????public java.lang.String toString() { /* compiled code */ }
????public final int hashCode() { /* compiled code */ }
????public final boolean equals(java.lang.Object o) { /* compiled code */ }
????public int x() { /* compiled code */ }
????public int y() { /* compiled code */ }
}
是不是有替代Lombok的潛質?
4.文本塊作為預覽特性保留
通常情況下我們定義一個字符串,如果比較長可使用如下形式進行編寫:
String html = "
\n" + "
\n" + "
Hello, world
\n" + "
\n";
使用java14的文本塊新特性,則可改寫為如下形式:
String html = """
??????????????
Hello, world
""";
文本塊是Java語言的新語法,可以用來表示任何字符串,具有更高的表達能力和更少的復雜度。
文本塊的開頭定界符是由三個雙引號字符(""")組成的序列,后面跟0個或多個空格,最后跟一個行終止符。內容從開頭定界符的行終止符之后的第一個字符開始。
結束定界符是三個雙引號字符的序列。內容在結束定界符的第一個雙引號之前的最后一個字符處結束。與字符串文字中的字符不同,文本塊的內容中可以直接包含雙引號字符。允許在文本塊中使用",但不是必需的或不建議使用。與字符串文字中的字符不同,內容可以直接包含行終止符。允許在文本塊中使用\n,但不是必需或不建議使用。
以上就是JDK14新特性的簡單介紹,當然,java14還有許多其他特性的優化,比如垃圾回收器的ParallelScavenge + SerialOld的棄用等。但在使用之前,還是需要慎重,畢竟很多特性都只是作為預覽特性出現,新的事物總是需要時間去慢慢適應環境。在本站的JDK新特性教程里,有歷代版本的JDK特性介紹,感興趣的小伙伴可以去了解一下。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習