更新時(shí)間:2021-02-01 17:26:20 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1461次
2020/3/17日J(rèn)DK14正式發(fā)版,每一次Java版本的更新都會(huì)帶來(lái)許多巨大的改變,對(duì)J從事Java行業(yè)和學(xué)習(xí)Java技術(shù)的人來(lái)說(shuō)都是不可不關(guān)注的重大事件。本文我們就帶大家初步認(rèn)識(shí)一下JDK14新特性。
Java 14對(duì)應(yīng)的JSR 389中包含16個(gè)JEP,也就是說(shuō)在JDK14中新增了16個(gè)新的特性。
在JDK14中新增了以下16個(gè)新特性:
305: instanceof的模式匹配 (預(yù)覽)
343: 打包工具 (Incubator)
345: G1的NUMA內(nèi)存分配優(yōu)化
349: JFR事件流
352: 非原子性的字節(jié)緩沖區(qū)映射
358: 友好的空指針異常
359: Records (預(yù)覽)
361: Switch表達(dá)式 (標(biāo)準(zhǔn))
362: 棄用Solaris和SPARC端口
363: 移除CMS(Concurrent Mark Sweep)垃圾收集器
364: macOS系統(tǒng)上的ZGC
365: Windows系統(tǒng)上的ZGC
366: 棄用ParallelScavenge + SerialOld GC組合
367: 移除Pack200 Tools和API
368: 文本塊 (第二個(gè)預(yù)覽版)
370: 外部存儲(chǔ)器API (Incubator)
上述的JDK新特性,有一些是我們之前學(xué)習(xí)Java中完全不曾見(jiàn)過(guò)的,有的則是在原有的基礎(chǔ)之上進(jìn)行了一些變化。JDK14的新特性不一定都是我們能夠用到的,下面我們重點(diǎn)來(lái)講幾個(gè)JDK14新特性。
1.instanceof模式匹配
通常情況下我們使用instanceof來(lái)探測(cè)類(lèi)的真實(shí)類(lèi)型,如果符合該類(lèi)型,則可進(jìn)行強(qiáng)制轉(zhuǎn)換。
在Java14之前,我們通常的寫(xiě)法如下:
Object obj = "班級(jí)";
if(obj instanceof String){
????String str = (String) obj;
????System.out.println("姓名:" + str);
}
通過(guò)java14的新特性,我們可以簡(jiǎn)化成如下方式:
Object obj = "班級(jí)";
if(obj instanceof String str){
????System.out.println("姓名:" + str);
}
我們可以通過(guò)模式匹配簡(jiǎn)潔地表達(dá)對(duì)象,并允許各種語(yǔ)句和表達(dá)式對(duì)其進(jìn)行測(cè)試。
2.Switch表達(dá)式
通常情況下我們通過(guò)如下形式使用switch語(yǔ)法:
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;
}
java14引入了新形式的switch標(biāo)簽“case L->”,表示如果匹配,則只執(zhí)行標(biāo)簽右邊的代碼。switch標(biāo)簽允許在每種情況下使用逗號(hào)分隔多個(gè)常量。
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);
}
這樣看上去十分簡(jiǎn)潔明了。
3.記錄類(lèi)型(Record Type)的引入
Java 14中記錄類(lèi)型(Record Type)作為預(yù)覽特性被引入。記錄對(duì)象允許使用緊湊的語(yǔ)法來(lái)聲明類(lèi),和枚舉類(lèi)型一樣,記錄也是類(lèi)的一種受限形式。
在idea 2020.1中,創(chuàng)建Record與創(chuàng)建類(lèi)和枚舉一樣,可以在創(chuàng)建時(shí)直接選擇對(duì)應(yīng)的類(lèi)型。
定義一個(gè)Record類(lèi)型如下:
public record Point(int x, int y) {
}
使用Record操作如下:
Point point = new Point(1,3);
System.out.println(point.x());
System.out.println(point.y());
對(duì)Record類(lèi)進(jìn)行反編譯我們會(huì)看到如下內(nèi)容:
public final class Point extends java.lang.Record {
????private final int x;
????private final int y;
????public Point(int x, int y) { /* compiled code */ }
????public java.lang.String toString() { /* compiled code */ }
????public final int hashCode() { /* compiled code */ }
????public final boolean equals(java.lang.Object o) { /* compiled code */ }
????public int x() { /* compiled code */ }
????public int y() { /* compiled code */ }
}
是不是有替代Lombok的潛質(zhì)?
4.文本塊作為預(yù)覽特性保留
通常情況下我們定義一個(gè)字符串,如果比較長(zhǎng)可使用如下形式進(jìn)行編寫(xiě):
String html = "
\n" + "
\n" + "
Hello, world
\n" + "
\n";
使用java14的文本塊新特性,則可改寫(xiě)為如下形式:
String html = """
??????????????
Hello, world
""";
文本塊是Java語(yǔ)言的新語(yǔ)法,可以用來(lái)表示任何字符串,具有更高的表達(dá)能力和更少的復(fù)雜度。
文本塊的開(kāi)頭定界符是由三個(gè)雙引號(hào)字符(""")組成的序列,后面跟0個(gè)或多個(gè)空格,最后跟一個(gè)行終止符。內(nèi)容從開(kāi)頭定界符的行終止符之后的第一個(gè)字符開(kāi)始。
結(jié)束定界符是三個(gè)雙引號(hào)字符的序列。內(nèi)容在結(jié)束定界符的第一個(gè)雙引號(hào)之前的最后一個(gè)字符處結(jié)束。與字符串文字中的字符不同,文本塊的內(nèi)容中可以直接包含雙引號(hào)字符。允許在文本塊中使用",但不是必需的或不建議使用。與字符串文字中的字符不同,內(nèi)容可以直接包含行終止符。允許在文本塊中使用\n,但不是必需或不建議使用。
以上就是JDK14新特性的簡(jiǎn)單介紹,當(dāng)然,java14還有許多其他特性的優(yōu)化,比如垃圾回收器的ParallelScavenge + SerialOld的棄用等。但在使用之前,還是需要慎重,畢竟很多特性都只是作為預(yù)覽特性出現(xiàn),新的事物總是需要時(shí)間去慢慢適應(yīng)環(huán)境。在本站的JDK新特性教程里,有歷代版本的JDK特性介紹,感興趣的小伙伴可以去了解一下。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743