JDK16的新特性

簡介

在2021年3月16日,JDK的迎來了它的一個新版本JDK16棕孙,雖然JDK16不是LTS版本钦铺,但是作為下一個LTS版本JDK17的先行版本矛洞,JDK16為我們帶來了17個方面的提升,包括了新的語言特性沼本、新的工具、內(nèi)存管理的提升等方面辫红。

所以一起來看看,JDK16到底為我們提供了些什么新的特性贴妻。

JDK16的新特性

總的來說名惩,JDK16有下面的一些新特性:

  • 一些在JDK14中引入的新特性,最終在JDK16中確定了娩鹉。
  • 內(nèi)存管理的提升
  • 新的打包工具
  • UNIX-Domain Socket channels
  • Value-based Classes的警告
  • Encapsulating JDK Internals by default
  • 提供了 C++ 14語言特性
  • 其他的一些預(yù)覽版本的新特性

下面圖是JDK從8開始到16的新特性個數(shù):

image

可以看到JDK8和JDK9是最多的底循,后面基本上變動比較少。

JDK8引入了stream阁苞,lambda祠挫,泛型等一系列非常有用的特性。而JDK9則引入了新的JPMS模塊化系統(tǒng)骚灸,所以變動比較多慌植。

相對而言,JDK10之后變動基本上比較小丈钙,也有可能跟固定6個月發(fā)一次版本有關(guān)系交汤。畢竟時間比較短,所以版本的變動也比較小星岗。

注意戒洼,JDK16并不是一個LTS版本,在9月發(fā)布的JDK17才是圈浇!,大家可以關(guān)注我的后續(xù)關(guān)于JDK17新特性的文章。到現(xiàn)在為止曹仗,JAVA的LTS版本就有JDK8蠕搜,JDK11和JDK17了妓灌。你現(xiàn)在用的是哪個呢?

語言方面的提升

JDK16在語言上的提升主要有兩個:Pattern matching和records虫埂。這兩個新特性都是在JDK14中作為預(yù)覽版本引入了掉伏,最終到JDK16變成了final版本。

先來看一下Pattern matching, Pattern matching主要說的就是instanceof關(guān)鍵詞斧散,我們知道在JAVA中判斷一個對象是不是某個類的實例,則可以使用instanceof栈暇,如果是該類的實例或者子類箍镜,則返回true色迂,否則返回false。

但是在判斷完之后脚草,要想使用對應(yīng)的對象馏慨,還需要顯示的進(jìn)行類型轉(zhuǎn)換如下所示:

//傳統(tǒng)寫法
        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類写隶,主要用來表示不可變對象的結(jié)構(gòu)體慕趴。

來看一個Records的定義:

public record Address(
        String addressName,
        String city
) {
}

上面我們定義了一個Address對象鄙陡,它有兩個屬性躏啰,分別是addressName和city,如果反編譯上面代碼的編譯結(jié)果,可以得到:

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;
    }
}

實際上就等于傳統(tǒng)的:

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;
    }
}

但是在編寫上要方便和簡單很多。

內(nèi)存管理方面的提升

在看看內(nèi)存管理方面的提升,主要有兩方面:Elastic Metaspace和ZGC的并發(fā)線程堆棧處理脯爪。

Metaspace 的主要功能是管理類的元數(shù)據(jù)的內(nèi)存。 引入 Elastic Metaspace 是為了改進(jìn) HotSpot JVM 中元空間內(nèi)存的分配和釋放惑艇。 可以更快地將不需要的內(nèi)存返回給操作系統(tǒng)滨巴,從而減少開銷和內(nèi)存碎片熄守。

Elastic Metaspace使用較小的塊分配內(nèi)存裕照,并通過將未使用的元空間內(nèi)存返回給操作系統(tǒng)來提高彈性。 它可以提高性能并降低維護(hù)成本。

那么什么是ZGC的并發(fā)線程堆棧處理呢负间?

我們知道ZGC是HotSpot JVM中一種低延時的垃圾回收算法态秧。但是在線程的堆棧處理過程中,總有一個制約因素就是safepoints藏鹊。在safepoints這個點,java的線程是要暫停執(zhí)行的,從而限制了GC的效率影涉。

而ZGC的并發(fā)線程堆棧處理可以保證java線程可以在GC safepoints的同時可以并發(fā)執(zhí)行规伐。

Unix-Domain Socket Channel

一般來說Socket通信是基于TCP/IP的鲜棠,但是熟悉unix的朋友應(yīng)該知道豁陆,在unix中一切都是以文件形式存在的馅而,即便是在內(nèi)部進(jìn)程的通訊也是如此用爪。

如果是同一個host上的進(jìn)程進(jìn)行通訊偎血,使用unix本身的inter-process communication (IPC)無疑是最快的方式,并且更加安全笨农。

所以在JDK16中增加了對Unix-Domain Socket Channel的支持竭宰。

Warning For Value-based Classes

這個是什么意思呢? 我們知道java中對應(yīng)的primary類型都有一個Object類型锁摔,比如int對應(yīng)的是Integer。

如果是用Integer的構(gòu)造函數(shù)励背,則我們可以這樣構(gòu)造:

 Integer integer= new Integer(100);

但是在JDK16中叶眉,這種構(gòu)造函數(shù)已經(jīng)被廢棄了:

    @Deprecated(since="9", forRemoval = true)
    public Integer(int value) {
        this.value = value;
    }

我們可以直接這樣寫:

Integer integer2= 100;

封裝內(nèi)部的JDK包

一般來說,我們用的包都是JDK公開的API炼蛤,但是有時候還是會用到一些JDK內(nèi)部使用的類,這種類是不建議直接在外部使用的嗽上,JDK16對大部分的這種類做了封裝,后面大家直接在標(biāo)準(zhǔn)JDK中查找使用即可浅萧。

C++ 14語言特性

這個是值JDK底層的C++ 源代碼使用C++ 14語言特性吩案,一般的JDK使用者是無法直接感受的徘郭。

預(yù)覽語言新特性

在JDK16中還加入了幾個預(yù)覽的語言新特性.這里主要講一下Vector API和Sealed Classes.

Vector API的想法是提供一種向量計算方法芋浮,最終能夠比傳統(tǒng)的標(biāo)量計算方法(在支持 CPU 架構(gòu)上)執(zhí)行得更好途样。什么叫做向量計算呢?熟悉pandas的朋友可能知道裆站,在pandas可以方便的對矩陣進(jìn)行計算,如果用java實現(xiàn)則需要計算矩陣中的每個元素,非常麻煩婚惫,這也是python的pandas庫能夠流行的原因。

現(xiàn)在JDK16也可以做到了牲芋,我們一起來看看,先是傳統(tǒng)寫法:

//傳統(tǒng)寫法
        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];
        }

如果我們希望兩個數(shù)組的數(shù)字相乘夕冲,則只能進(jìn)行每個元素的遍歷。現(xiàn)在的寫法:

        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);

我們構(gòu)建兩個Vector變量,直接調(diào)用Vector類的mul方法即可篙悯。

fromArray中有三個參數(shù)鸽照,第一個是向量的長度,第二是原數(shù)組澜沟,第三個是偏移量既们。因為一個int有4個字節(jié)啥纸,所以這里我們使用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 表示可以允許任何類繼承爽哎。

總結(jié)

以上就是JDK16給我們帶來的新特性课锌,總體而言是很有用的请毛,大家覺得呢方仿?

本文例子learn-java-base-9-to-20

本文已收錄于 http://www.flydean.com/26-jdk16-new-features/

最通俗的解讀此洲,最深刻的干貨,最簡潔的教程趟紊,眾多你不知道的小技巧等你來發(fā)現(xiàn)霎匈!

歡迎關(guān)注我的公眾號:「程序那些事」,懂技術(shù)暖释,更懂你!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子采转,更是在濱河造成了極大的恐慌瞬痘,老刑警劉巖图云,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異克婶,居然都是意外死亡丹泉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晒哄,“玉大人,你說我怎么就攤上這事柒傻〗夏荆” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長峰锁。 經(jīng)常有香客問我虹蒋,道長耍目,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘虏杰。我一直安慰自己从撼,他們只是感情好掏婶,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淀弹,像睡著了一般琉用。 火紅的嫁衣襯著肌膚如雪刁愿。 梳的紋絲不亂的頭發(fā)上觉壶,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音涩笤,去河邊找鬼炒刁。 笑死绽昏,一個胖子當(dāng)著我的面吹牛认然,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼师抄!你這毒婦竟也來了茶鉴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤商架,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛇摸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唬格,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡烹困,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年奢方,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹊奖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡啸盏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隧出,我是刑警寧澤客燕,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布也搓,位于F島的核電站涵紊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颤练。R本人自食惡果不足惜驱负,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一跃脊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧器瘪,春花似錦绘雁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抹缕,卻和暖如春墨辛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留磨淌,地道東北人梁只。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像秋忙,于是被迫代替她去往敵國和親构舟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容