JDK13今日發佈,帶來5大新特性
JDK
JDK作爲JAVA的核心,發展至今,已經更新到13版本了。
早在2017年8月,JCP執行委員會就已經提出將JAVA的發佈頻率修改調整爲每六個月一次,新的發佈週期將嚴格遵循這個時間點,每年的3月份和9月份將會發布新的JDK。
今日,JDK13正式發佈,在官網上,我們可以看到JDK13的進展情況。
JDK13
可以看到,今日JDK13已經處於一般可用性階段,即是JDK13從今日起可以正式使用了。
JDK13主要有5大特性:
JDK13新特性
下面我們具體來看看這5大新特性。
01.動態CDS檔案
這一特性是在JEP310:AppCDS基礎上擴展而來的,可以讓Java應用程序在執行結束時動態歸檔類。歸檔類包括默認的基礎層CDS存檔中不存在的所有已加載的應用程序類和庫類。
在JEP310上,使用AppCDS的過程還是比較複雜的,需要有三個步驟:
- 執行一次或多次試運行以創建班級列表
- 使用創建的類列表轉儲存檔
- 運行存檔
除此之外,JEP310僅適用於使用內置類加載器的應用程序。而對HotSpot中由用戶定義的類加載器加載的歸檔類僅僅只有實驗性支持,並且不容易使用。
而在JDK13中的JEP520中,可以在第一次運行應用程序期間執行自動存檔生成。這將消除顯式存檔創建步驟(即上面的步驟2)。
也就是說,在Java 13中使用AppCDS的時候,就不在需要這麼複雜的步驟了。
我們再來看看JDK13中動態檔案中的共享空間
佈局跟靜態存檔類似,動態存檔元數據分爲以下四個空格。不需要“md”空間。
- rw:可讀/可寫數據
- ro:只讀數據
- mc:蹦牀
“ro”空間以只讀方式映射,以啓用跨進程共享。運行時在共享空間單獨映射。
另外記憶儲蓄功能:針對在同一主機上運行多個相關進程,我們可以使用兩個級別的存檔來提高內存共享。
比如,共享同一組庫的程序時:
使用“-cp:lib.jar:foo.jar FooApp”運行的2個進程
使用“-cp:lib.jar:bar.jar BarApp”運行的4個進程
您可以僅爲lib.jar中的類(以及這些應用程序使用的其他系統類)創建靜態存檔(使用類列表)。然後,創建兩個不同的動態檔案,一個用於“foo”應用程序,另一個用於“bar”應用程序。
這樣,靜態存檔可以在所有6個進程中共享,動態存檔可以在運行相同程序的進程之間共享。
02.ZGC:取消使用未使用的內存
我們知道在JDK 11中,Java引入了ZGC,這個可伸縮的低延遲垃圾收集器,但它只是實驗性的,並沒有得到正式的應用。並且,ZGC釋放的內存是不會還給操作系統的,即使該內存長時間未使用,這樣一來它就浪費了大量的資源。
在JDK13中,JEP351再次增強了ZGC,可以將未使用的堆內存返回給操作系統。
之所以新增這個特性,是爲了不浪費某些場景中內存這個比較昂貴的資源。尤其是那些需要關注內存佔用的應用程序和環境,例如:
- 通過使用支付資源的容器環境。
- 應用程序可能長時間處於空閒狀態並與許多其他應用程序共享或競爭資源的環境。
- 應用程序在執行期間可能具有非常不同的堆空間要求。例如,啓動期間所需的堆可能大於穩態執行期間稍後所需的堆。
JDK13提供這種功能,對於某些類別的用戶來說它是非常有用的。將此功能添加到ZGC中將受到同一組用戶的深度歡迎。
03.重新實現Legacy Socket API
JDK13中使用更簡單、更現代的實現替換掉java.net.Socket和java.net.ServerSocketAPI,用最底層來實現,便於維護和調試。而且新的實現很容易適應用戶模式線程,也就是光纖,目前正在Project Loom中進行探索。
JDK13中,用NioSocketImpl來替代舊的PlainSocketImpl。因爲它的開發易於維護和調試。不需要自己的本機代碼,它與New I / O(NIO)實現共享相同的JDK內部基礎結構。它不需要使用線程堆棧進行I / O,因爲它與現有的緩衝區緩存機制集成。
NioSocketImpl中使用java.util.concurrent鎖而不是synchronized方法,以便將來可以很好地與光纖配合使用。
要注意的是:
在JDK13中,舊的實現不會刪除,仍舊會保留在JDK中,這樣做是爲了降低二十多年後切換的風險。可以通過配置系統屬性(jdk.net.usePlainSocketImpl)的方式來切換新舊實現。將來的某些版本將會刪除PlainSocketImpl這個系統屬性。
04.切換表達式(預覽)
在JDK 12中引入了Switch表達式作爲預覽特性。JDK13中修改了這個特性,它引入了yield語句,用於switch返回值。這意味着,後續switch表達式(如果要返回值)應該使用yield。
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;
}
在這段代碼中,有許多break語句,讓程序不必要地冗長,並且這種視覺噪聲經常掩蓋難以調試的錯誤,其中缺少的break語句意味着意外掉落。
在JDK13中,引入了一種新形式的開關標籤“ case L ->”,表示如果標籤匹配,則只執行標籤右側的代碼。並且還可以使用多個常量,用逗號分隔。
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);
}
可以看到,新特性中的代碼用法更加的簡潔、明瞭。
另外,
新特性中用yield語句作爲返回值用法:
int j = switch (day) {
case MONDAY -> 0;
case TUESDAY -> 1;
default -> {
int k = day.toString().length();
int result = f(k);
yield result;
}
};
或者
int j = switch (day) {
case MONDAY -> yield 0;
case TUESDAY -> yield 1;
default -> {
int k = day.toString().length();
int result = f(k);
yield result;
}
};
從JDK13開始,switch中就多了一個關鍵字yield用於跳出switch塊,並且返回一個值。yield和return的區別在於:return會直接跳出當前循環或者方法,而yield只會跳出當前switch塊。
05.文字塊(預覽)
早在JDK 12中,就引入了Raw String Literals特性,但在發佈之前就已經被撤回來。JDK13中的文字塊與這個類似。
文本塊是一個多行字符串文字,它避免了對大多數轉義序列的需要,以可預測的方式自動格式化字符串,將文本塊添加到Java語言,並在需要時讓開發人員控制格式。
新特性主要有以下的幾個目的:
- 通過簡化表達跨越多行源代碼的字符串,同時避免常見情況下的轉義序列,簡化編寫Java程序的任務。
- 增強Java程序中字符串的可讀性,表示用非Java語言編寫的代碼。
- 通過規定任何新構造可以表達與字符串文字相同的字符串集,並解釋相同的轉義序列,並像字符串文字一樣進行操作,支持從字符串文字進行遷移。
我們以前從外部複製一段文本串到Java代碼中,常常會被自動轉義,例如以下字符串:
<html>
<body>
<p>Hello, world</p>
</body>
</html>
將其複製到java代碼字符串中,將會是這樣的:
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
可以看到,代碼自主的進行了轉義,而且看起來很不美觀。
在JDK13中,使用"""作爲開始符和結束符,直接放置多行的代碼塊,不需要任何的轉義 ,看起來很乾淨。
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
還有,我們經常用到的SQL語句:
String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" +
"WHERE `CITY` = 'INDIANAPOLIS'\n" +
"ORDER BY `EMP_ID`, `LAST_NAME`;\n";
在JDK13中,可以這樣用:
String query = """
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = 'INDIANAPOLIS'
ORDER BY `EMP_ID`, `LAST_NAME`;
""";
這樣看起來就更加的直觀了,讓人一目瞭然。
總結
以上就是JDK13中5大新特性的相關信息了,就我個人的看法,對我們編碼工作有影響的就第4,5這兩個新特性了,這兩個特性將會大大縮減我們日後的編碼工作,而且也會讓我們的編碼風格更加的直觀,簡潔。但是這兩個新特性目前還只是預覽階段。
值得注意的是,JDK13並不是長期支持的版本,所以暫時可以不用升級到JDK13,保持現有的JDK版本就好了。