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>
"" +
"
" +"
"" +
"";
Java 14 可以實用三個引號作為字符串塊了:
// 注意 """ 之後必須換行
String str = """
<header>
""";
增強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
閱讀更多 程序員小楊 的文章