Java 14 新特性


JDK 14 也就是我們說的 Java14 發佈了,那你已經瞭解到了它有哪些新的特性了嗎?

這次在新的 Java14 中加入了非常多的語法糖,這可以使得我們在編程過程中更加的快捷,寫出來的代碼也會更加簡介一些。話不多說,我們馬上來看看這次更新了哪些新特性吧!

增強 instanceOf 類型推斷

在 Java 14 之前我們需要這樣寫代碼:

Object object = someOneObj();

if(object instanceof String){

boolean isContainsA = ((String) object).contains("A");

}


現在我們只需要這樣寫:

Object object = someOneObj();

if (object instanceof String str) { // 注意這裡更換了變量名

boolean isContainsA = str.contains("A");

}

// 還能繼續加入判斷條件

if (object instanceof String str && str.contains("A")) {

System.out.println(str);

}


增強 switch case 代碼塊

以前我們寫 switch case 是這樣的:

String day = getDay();

switch (day) {

case "週一":

case "週二":

System.out.println("這裡是週一和週二");

break;

case "週三":

System.out.println("這裡是週三");

break;

case "週四":

System.out.println("這裡是週四");

break;

default:

System.out.println("這裡是週五六日");

break;

}


Java 14 我們可以這樣寫啦:


String day = getDay();

switch (day) {

case "週一", "週二" -> System.out.println("這裡是週一和週二");

case "週三" -> System.out.println("這裡是週三");

case "週四" -> System.out.println("這裡是週四");

default -> System.out.println("這裡是週五六日");

}


還可以新增返回值哦:


boolean isWorkday = switch (day) {

case "週六", "週日" -> false;

default -> true;

};


甚至可以利用yield把返回值掛起:


boolean isWorkday = switch (day) {

case "週六", "週日" -> false;

default -> {

boolean isWeekend = isWeekend(day);

yield isWeekend;// 這2行可以合併省略變量,為了解釋留下的

}

};


新增構造函數關鍵字 record

以前我們構造一個 class, 按照規範需要寫get,set,equals,hashcode等方法:

public class SomeClass {

private String stringField;

private int intField;

public SomeClass(String stringField, int intField) {

this.stringField = stringField;

this.intField = intField;

}

public String getStringField() {

return stringField;

}

public void setStringField(String stringField) {

this.stringField = stringField;

}

public int getIntField() {

return intField;

}

public void setIntField(int intField) {

this.intField = intField;

}

// 剩下的equals toString hashcode 等方法...

}


現在只需要加入關鍵字 record 就行了:


record SomeClass(String strFiled, int intFiled) {

// 它會自動生成equals,tostring,hashcode get/set等方法

}


注意:

record 是修飾在 class 名的,不是構造函數,也就是說你不用再寫 public class SomeClass 了。

它所有修飾的字段是final類型的,基礎數據類型不可以再更改值,但是對象可以更改內部字段。

它默認繼承了Record類,所以不能再繼承其他類了,所生成的類也是final類型的。

可以繼續增加靜態屬性:


Java

record SomeClass(String strFiled, int intFiled) {

static int number = 1;

}


字符串塊

以前我們寫長長的字符串,需要這樣寫:


String str = "" +

"<header>" +/<header>

"" +

"

" +

"

body
" +

"" +

"";


Java 14 可以實用三個引號作為字符串塊了:

// 注意 """ 之後必須換行

String str = """

<header>

"body"

""";


增強NPE NullPointerException 錯誤推斷

以前NPE報錯只報哪一行:


line 1 User user = someUser();

line 2 user.getChild().getName().someMethod();


比如你收到 line 2 出現了 NPE, 那你知道是user為null呢?還是user的child為null呢?還是他的name為null呢?

現在 Java 14 優化了這個報錯,會直接告訴你具體是哪一個屬性出現了null:


Exception in thread "main" java.lang.NullPointerException:

Cannot read field 'user' because 'user.getChild()' is null.

at Prog.main(Prog.java:5)


Non-Volatile Mapped Byte Buffers

Java NIO(New IO)JDK 1.4以來就存在,FileChannel使用MappedByteBuffer將文件數據的一部分加載到虛擬內存中,然後引入了新的增強,稱為Path。Path是一個接口,當我們在java NIO中工作時,它將java.io.File類替換為文件或目錄的表示。

現在JEP的目標是在MappedByteBuffer中進行增強,以便non-volatile memory (NVM)中加載文件數據的部分。在這種存儲器中,即使像ROM(只讀存儲器)、Flash存儲器、硬盤等存儲設備關閉電源,數據也不會丟失/刪除;在non-vllatile的情況下,如果像RAM一樣關閉電源,數據也不會保留。唯一需要更改的API是FileChannel客戶端使用的新枚舉,用於請求位於NVM支持的文件系統(而不是傳統的文件存儲系統)上的文件的映射。

此實現允許通過ByteBuffer將NVM作為堆外資源進行管理。一個相關的增強,JDK-8153111,正在研究對堆數據使用NVM。可能還需要考慮使用NVM來存儲JVM元數據。這些不同的NVM管理模式在結合使用時可能不兼容,或者可能只是不合適。該API只能處理高達2GB的映射區域。可能需要修改建議的實現,使其符合JDK-8180628中建議的更改,以克服此限制。

打包工具

Java 14 計劃引入打包功能,以簡化依賴於各種依賴項的安裝過程。有時僅僅提供一個JAR文件是不夠的;它必須提供一個適合本地/本機的可安裝工具包。打包工具還可以幫助填補其他技術留下的空白。

jpackage工具將Java應用程序捆綁到一個特定於平臺的包中,該包包含所需的所有依賴項。作為一組普通的JAR文件或模塊集合。支持的特定於平臺的包格式包括:

Linux:deb和rpm

macOS:pkg和dmg

Windows:msi和exe

G1 的非均勻存儲器訪問

非均勻存儲器訪問(Non-uniform memory accession,NUMA)是一種將微處理器集群配置成多處理系統的方法,可以實現內存的局部共享,提高系統性能,擴展系統能力。

Java 14正計劃實現支持NUMA的內存分配,以提高大型計算機上的G1性能。

G1的堆被組織為固定大小區域的集合。一個區域通常是一組物理頁面,但是當使用大頁面(via-XX:+UseLargePages)時,幾個區域可以組成一個物理頁面。

如果指定了+XX:+UseNUMA選項,那麼當JVM初始化時,區域將均勻地分佈在可用的NUMA節點總數上。

JFR 事件流

Java 14 正計劃提供一個API,通過該API,JDK飛行記錄器(JFR)收集的數據將連續監視進程內和進程外應用程序。

可以以非流式方式記錄相同的事件集,如果可能的話,開銷小於1%。因此,事件流將與非流同時執行。

jdk.jfr模塊中的jdk.jfr.consumer包擴展了異步訂閱事件的功能。

其他特性

廢除了 Solaris / SPARC, Solaris / x64, and Linux / SPARC, 並會在以後的版本中徹底移除

移除了CMS垃圾回收器

給windows和macOS新增了特定垃圾回收器

廢除了並行清楚和串行GC(ParallelScavenge + SerialOld GC)組合

移除了pack200 相關工具和api


分享到:


相關文章: