簡介
在2021年3月16日,JDK的迎來了它的一個新版本JDK16,雖然JDK16不是LTS版本,但是作為下一個LTS版本JDK17的先行版本,JDK16為我們帶來了17個方面的提升,包括了新的語言特性、新的工具、記憶體管理的提升等方面。
所以一起來看看,JDK16到底為我們提供了些什麼新的特性。
JDK16的新特性
總的來說,JDK16有下面的一些新特性:
- 一些在JDK14中引入的新特性,最終在JDK16中確定了。
- 記憶體管理的提升
- 新的打包工具
- UNIX-Domain Socket channels
- Value-based Classes的警告
- Encapsulating JDK Internals by default
- 提供了 C++ 14語言特性
- 其他的一些預覽版本的新特性
下面圖是JDK從8開始到16的新特性個數:
可以看到JDK8和JDK9是最多的,後面基本上變動比較少。
JDK8引入了stream,lambda,泛型等一系列非常有用的特性。而JDK9則引入了新的JPMS模組化系統,所以變動比較多。
相對而言,JDK10之後變動基本上比較小,也有可能跟固定6個月發一次版本有關係。畢竟時間比較短,所以版本的變動也比較小。
注意,JDK16並不是一個LTS版本,在9月釋出的JDK17才是!,大家可以關注我的後續關於JDK17新特性的文章。到現在為止,JAVA的LTS版本就有JDK8,JDK11和JDK17了。你現在用的是哪個呢?
語言方面的提升
JDK16在語言上的提升主要有兩個:Pattern matching和records。這兩個新特性都是在JDK14中作為預覽版本引入了,最終到JDK16變成了final版本。
先來看一下Pattern matching, Pattern matching主要說的就是instanceof關鍵詞,我們知道在JAVA中判斷一個物件是不是某個類的例項,則可以使用instanceof,如果是該類的例項或者子類,則返回true,否則返回false。
但是在判斷完之後,要想使用對應的物件,還需要顯示的進行型別轉換如下所示:
//傳統寫法
if(site instanceof String){
String stringSite = (String)site;
System.out.println(stringSite.length());
}
在JDK16中的Pattern matching中,可以這樣寫:
//JDK16寫法
if(site instanceof String stringSite){
System.out.println(stringSite.length());
}
另外一個final版本的就是在JDK14和15中引入的Records,Records是一個特殊的java類,主要用來表示不可變物件的結構體。
來看一個Records的定義:
public record Address(
String addressName,
String city
) {
}
上面我們定義了一個Address物件,它有兩個屬性,分別是addressName和city,如果反編譯上面程式碼的編譯結果,可以得到:
public record Address(String addressName, String city) {
public Address(String addressName, String city) {
this.addressName = addressName;
this.city = city;
}
public String addressName() {
return this.addressName;
}
public String city() {
return this.city;
}
}
實際上就等於傳統的:
public class AddressOld {
private final String addressName;
private final String city;
public AddressOld(String addressName, String city) {
this.addressName = addressName;
this.city = city;
}
public String getAddressName() {
return addressName;
}
public String getCity() {
return city;
}
}
但是在編寫上要方便和簡單很多。
記憶體管理方面的提升
在看看記憶體管理方面的提升,主要有兩方面:Elastic Metaspace和ZGC的併發執行緒堆疊處理。
Metaspace 的主要功能是管理類的後設資料的記憶體。 引入 Elastic Metaspace 是為了改進 HotSpot JVM 中元空間記憶體的分配和釋放。 可以更快地將不需要的記憶體返回給作業系統,從而減少開銷和記憶體碎片。
Elastic Metaspace使用較小的塊分配記憶體,並通過將未使用的元空間記憶體返回給作業系統來提高彈性。 它可以提高效能並降低維護成本。
那麼什麼是ZGC的併發執行緒堆疊處理呢?
我們知道ZGC是HotSpot JVM中一種低延時的垃圾回收演算法。但是線上程的堆疊處理過程中,總有一個制約因素就是safepoints。在safepoints這個點,java的執行緒是要暫停執行的,從而限制了GC的效率。
而ZGC的併發執行緒堆疊處理可以保證java執行緒可以在GC safepoints的同時可以併發執行。
Unix-Domain Socket Channel
一般來說Socket通訊是基於TCP/IP的,但是熟悉unix的朋友應該知道,在unix中一切都是以檔案形式存在的,即便是在內部程式的通訊也是如此。
如果是同一個host上的程式進行通訊,使用unix本身的inter-process communication (IPC)無疑是最快的方式,並且更加安全。
所以在JDK16中增加了對Unix-Domain Socket Channel的支援。
Warning For Value-based Classes
這個是什麼意思呢? 我們知道java中對應的primary型別都有一個Object型別,比如int對應的是Integer。
如果是用Integer的建構函式,則我們可以這樣構造:
Integer integer= new Integer(100);
但是在JDK16中,這種建構函式已經被廢棄了:
@Deprecated(since="9", forRemoval = true)
public Integer(int value) {
this.value = value;
}
我們可以直接這樣寫:
Integer integer2= 100;
封裝內部的JDK包
一般來說,我們用的包都是JDK公開的API,但是有時候還是會用到一些JDK內部使用的類,這種類是不建議直接在外部使用的,JDK16對大部分的這種類做了封裝,後面大家直接在標準JDK中查詢使用即可。
C++ 14語言特性
這個是值JDK底層的C++ 原始碼使用C++ 14語言特性,一般的JDK使用者是無法直接感受的。
預覽語言新特性
在JDK16中還加入了幾個預覽的語言新特性.這裡主要講一下Vector API和Sealed Classes.
Vector API的想法是提供一種向量計算方法,最終能夠比傳統的標量計算方法(在支援 CPU 架構上)執行得更好。什麼叫做向量計算呢?熟悉pandas的朋友可能知道,在pandas可以方便的對矩陣進行計算,如果用java實現則需要計算矩陣中的每個元素,非常麻煩,這也是python的pandas庫能夠流行的原因。
現在JDK16也可以做到了,我們一起來看看,先是傳統寫法:
//傳統寫法
int[] x = {1, 2, 3, 4};
int[] y = {4, 3, 2, 1};
int[] c = new int[x.length];
for (int i = 0; i < x.length; i++) {
c[i] =x[i] * y[i];
}
如果我們希望兩個陣列的數字相乘,則只能進行每個元素的遍歷。現在的寫法:
var vectorA = IntVector.fromArray(IntVector.SPECIES_128, x, 0);
var vectorB = IntVector.fromArray(IntVector.SPECIES_128, y, 0);
var vectorC = vectorA.mul(vectorB);
vectorC.intoArray(c, 0);
我們構建兩個Vector變數,直接呼叫Vector類的mul方法即可。
fromArray中有三個引數,第一個是向量的長度,第二是原陣列,第三個是偏移量。因為一個int有4個位元組,所以這裡我們使用SPECIES_128。
Sealed Classes是在JDK15中引入的概念,它表示某個類允許哪些類來繼承它:
public sealed class SealExample permits Seal1, Seal2{
}
public non-sealed class Seal1 extends SealExample {
}
public final class Seal2 extends SealExample {
}
final表示Seal2不能再被繼承了。non-sealed 表示可以允許任何類繼承。
總結
以上就是JDK16給我們帶來的新特性,總體而言是很有用的,大家覺得呢?
本文已收錄於 http://www.flydean.com/26-jdk16-new-features/
最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!