一文帶你看遍 JDK9~14 的重要新特性!

Java9

發(fā)布于 2017 年 9 月 21 日 。作為 Java8 之后 3 年半才發(fā)布的新版本,Java 9 帶 來(lái)了很多重大的變化其中最重要的改動(dòng)是 Java 平臺(tái)模塊系統(tǒng)的引入,其他還有諸如集合、Stream 流

Java 平臺(tái)模塊系統(tǒng)

Java 平臺(tái)模塊系統(tǒng),也就是 Project Jigsaw,把模塊化開(kāi)發(fā)實(shí)踐引入到了 Java 平臺(tái)中。在引入了模塊系統(tǒng)之后,JDK 被重新組織成 94 個(gè)模塊。Java 應(yīng)用可以通過(guò)新增的 jlink 工具,創(chuàng)建出只包含所依賴(lài)的 JDK 模塊的自定義運(yùn)行時(shí)鏡像。這樣可以極大的減少 Java 運(yùn)行時(shí)環(huán)境的大小。

Java 9 模塊的重要特征是在其工件(artifact)的根目錄中包含了一個(gè)描述模塊的 module-info.class 文 件。 工件的格式可以是傳統(tǒng)的 JAR 文件或是 Java 9 新增的 JMOD 文件。

Jshell

jshell 是 Java 9 新增的一個(gè)實(shí)用工具。為 Java 提供了類(lèi)似于 Python 的實(shí)時(shí)命令行交互工具。

在 Jshell 中可以直接輸入表達(dá)式并查看其執(zhí)行結(jié)果

集合、Stream 和 Optional

  • 增加 了 List.of()、Set.of()、Map.of()Map.ofEntries()等工廠(chǎng)方法來(lái)創(chuàng)建不可變集合,比如List.of("Java", "C++");Map.of("Java", 1, "C++", 2);(這部分內(nèi)容有點(diǎn)參考 Guava 的味道)
  • Stream 中增加了新的方法 ofNullable、dropWhiletakeWhileiterate 方法。Collectors 中增加了新的方法 filteringflatMapping
  • Optional 類(lèi)中新增了 ifPresentOrElse、orstream 等方法

進(jìn)程 API

Java 9 增加了 ProcessHandle 接口,可以對(duì)原生進(jìn)程進(jìn)行管理,尤其適合于管理長(zhǎng)時(shí)間運(yùn)行的進(jìn)程

平臺(tái)日志 API 和服務(wù)

Java 9 允許為 JDK 和應(yīng)用配置同樣的日志實(shí)現(xiàn)。新增了 System.LoggerFinder 用來(lái)管理 JDK 使 用的日志記錄器實(shí)現(xiàn)。JVM 在運(yùn)行時(shí)只有一個(gè)系統(tǒng)范圍的 LoggerFinder 實(shí)例。

我們可以通過(guò)添加自己的 System.LoggerFinder 實(shí)現(xiàn)來(lái)讓 JDK 和應(yīng)用使用 SLF4J 等其他日志記錄框架。

反應(yīng)式流 ( Reactive Streams )

  • 在 Java9 中的 java.util.concurrent.Flow 類(lèi)中新增了反應(yīng)式流規(guī)范的核心接口
  • Flow 中包含了 Flow.PublisherFlow.Subscriber、Flow.SubscriptionFlow.Processor 等 4 個(gè)核心接口。Java 9 還提供了SubmissionPublisher 作為Flow.Publisher 的一個(gè)實(shí)現(xiàn)。

變量句柄

  • 變量句柄是一個(gè)變量或一組變量的引用,包括靜態(tài)域,非靜態(tài)域,數(shù)組元素和堆外數(shù)據(jù)結(jié)構(gòu)中的組成部分等
  • 變量句柄的含義類(lèi)似于已有的方法句柄MethodHandle
  • 由 Java 類(lèi)java.lang.invoke.VarHandle 來(lái)表示,可以使用類(lèi) java.lang.invoke.MethodHandles.Lookup 中的靜態(tài)工廠(chǎng)方法來(lái)創(chuàng)建 VarHandle 對(duì) 象

改進(jìn)方法句柄(Method Handle)

  • 方法句柄從 Java7 開(kāi)始引入,Java9 在類(lèi)java.lang.invoke.MethodHandles 中新增了更多的靜態(tài)方法來(lái)創(chuàng)建不同類(lèi)型的方法句柄

其它新特性

  • 接口私有方法 :Java 9 允許在接口中使用私有方法
  • try-with-resources 增強(qiáng) :在 try-with-resources 語(yǔ)句中可以使用 effectively-final 變量(什么是 effectively-final 變量,見(jiàn)這篇文章 http://ilkinulas.github.io/programming/java/2016/03/27/effectively-final-java.html
  • 類(lèi) CompletableFuture 中增加了幾個(gè)新的方法(completeAsync ,orTimeout 等)
  • Nashorn 引擎的增強(qiáng) :Nashorn 從 Java8 開(kāi)始引入的 JavaScript 引擎,Java9 對(duì) Nashorn 做了些增強(qiáng),實(shí)現(xiàn)了一些 ES6 的新特性
  • I/O 流的新特性 :增加了新的方法來(lái)讀取和復(fù)制 InputStream 中包含的數(shù)據(jù)
  • 改進(jìn)應(yīng)用的安全性能 :Java 9 新增了 4 個(gè) SHA- 3 哈希算法,SHA3-224、SHA3-256、SHA3-384 和 S HA3-512
  • ......

Java10

發(fā)布于 2018 年 3 月 20 日,最知名的特性應(yīng)該是 var 關(guān)鍵字(局部變量類(lèi)型推斷)的引入了,其他還有垃圾收集器改善、GC 改進(jìn)、性能提升、線(xiàn)程管控等一批新特性

var 關(guān)鍵字

  • 介紹 :提供了 var 關(guān)鍵字聲明局部變量:var list = new ArrayList<String>(); // ArrayList<String>
  • 局限性 :只能用于帶有構(gòu)造器的局部變量和 for 循環(huán)中

Guide 哥:實(shí)際上 Lombok 早就體用了一個(gè)類(lèi)似的關(guān)鍵字,使用它可以簡(jiǎn)化代碼,但是可能會(huì)降低程序的易讀性、可維護(hù)性。一般情況下,我個(gè)人都不太推薦使用。

不可變集合

list,set,map 提供了靜態(tài)方法copyOf()返回入?yún)⒓系囊粋€(gè)不可變拷貝(以下為 JDK 的源碼)

static <E> List<E> copyOf(Collection<? extends E> coll) {
    return ImmutableCollections.listCopy(coll);
}

java.util.stream.Collectors中新增了靜態(tài)方法,用于將流中的元素收集為不可變的集合

Optional

  • 新增了orElseThrow()方法來(lái)在沒(méi)有值時(shí)拋出異常

并行全垃圾回收器 G1

從 Java9 開(kāi)始 G1 就了默認(rèn)的垃圾回收器,G1 是以一種低延時(shí)的垃圾回收器來(lái)設(shè)計(jì)的,旨在避免進(jìn)行 Full GC,但是 Java9 的 G1 的 FullGC 依然是使用單線(xiàn)程去完成標(biāo)記清除算法,這可能會(huì)導(dǎo)致垃圾回收期在無(wú)法回收內(nèi)存的時(shí)候觸發(fā) Full GC。

為了最大限度地減少 Full GC 造成的應(yīng)用停頓的影響,從 Java10 開(kāi)始,G1 的 FullGC 改為并行的標(biāo)記清除算法,同時(shí)會(huì)使用與年輕代回收和混合回收相同的并行工作線(xiàn)程數(shù)量,從而減少了 Full GC 的發(fā)生,以帶來(lái)更好的性能提升、更大的吞吐量。

應(yīng)用程序類(lèi)數(shù)據(jù)共享

在 Java 5 中就已經(jīng)引入了類(lèi)數(shù)據(jù)共享機(jī)制 (Class Data Sharing,簡(jiǎn)稱(chēng) CDS),允許將一組類(lèi)預(yù)處理為共享歸檔文件,以便在運(yùn)行時(shí)能夠進(jìn)行內(nèi)存映射以減少 Java 程序的啟動(dòng)時(shí)間,當(dāng)多個(gè) Java 虛擬機(jī)(JVM)共享相同的歸檔文件時(shí),還可以減少動(dòng)態(tài)內(nèi)存的占用量,同時(shí)減少多個(gè)虛擬機(jī)在同一個(gè)物理或虛擬的機(jī)器上運(yùn)行時(shí)的資源占用

Java 10 在現(xiàn)有的 CDS 功能基礎(chǔ)上再次拓展,以允許應(yīng)用類(lèi)放置在共享存檔中。CDS 特性在原來(lái)的 bootstrap 類(lèi)基礎(chǔ)之上,擴(kuò)展加入了應(yīng)用類(lèi)的 CDS (Application Class-Data Sharing) 支持。其原理為:在啟動(dòng)時(shí)記錄加載類(lèi)的過(guò)程,寫(xiě)入到文本文件中,再次啟動(dòng)時(shí)直接讀取此啟動(dòng)文本并加載。設(shè)想如果應(yīng)用環(huán)境沒(méi)有大的變化,啟動(dòng)速度就會(huì)得到提升

其他特性

  • 線(xiàn)程-局部管控:Java 10 中線(xiàn)程管控引入 JVM 安全點(diǎn)的概念,將允許在不運(yùn)行全局 JVM 安全點(diǎn)的情況下實(shí)現(xiàn)線(xiàn)程回調(diào),由線(xiàn)程本身或者 JVM 線(xiàn)程來(lái)執(zhí)行,同時(shí)保持線(xiàn)程處于阻塞狀態(tài),這種方式使得停止單個(gè)線(xiàn)程變成可能,而不是只能啟用或停止所有線(xiàn)程

  • 備用存儲(chǔ)裝置上的堆分配:Java 10 中將使得 JVM 能夠使用適用于不同類(lèi)型的存儲(chǔ)機(jī)制的堆,在可選內(nèi)存設(shè)備上進(jìn)行堆內(nèi)存分配

  • 統(tǒng)一的垃圾回收接口:Java 10 中,hotspot/gc 代碼實(shí)現(xiàn)方面,引入一個(gè)干凈的 GC 接口,改進(jìn)不同 GC 源代碼的隔離性,多個(gè) GC 之間共享的實(shí)現(xiàn)細(xì)節(jié)代碼應(yīng)該存在于輔助類(lèi)中。統(tǒng)一垃圾回收接口的主要原因是:讓垃圾回收器(GC)這部分代碼更加整潔,便于新人上手開(kāi)發(fā),便于后續(xù)排查相關(guān)問(wèn)題。

Java11

Java11 于 2018 年 9 月 25 日正式發(fā)布,這是很重要的一個(gè)版本!Java 11 和 2017 年 9 月份發(fā)布的 Java 9 以及 2018 年 3 月份發(fā)布的 Java 10 相比,其最大的區(qū)別就是:在長(zhǎng)期支持(Long-Term-Support)方面,Oracle 表示會(huì)對(duì) Java 11 提供大力支持,這一支持將會(huì)持續(xù)至 2026 年 9 月。這是據(jù) Java 8 以后支持的首個(gè)長(zhǎng)期版本。

字符串加強(qiáng)

Java 11 增加了一系列的字符串處理方法,如以下所示。

Guide 哥:說(shuō)白點(diǎn)就是多了層封裝,JDK 開(kāi)發(fā)組的人沒(méi)少看市面上常見(jiàn)的工具類(lèi)框架啊!

//判斷字符串是否為空
" ".isBlank();//true
//去除字符串首尾空格
" Java ".strip();// "Java" 
//去除字符串首部空格
" Java ".stripLeading();   // "Java "  
//去除字符串尾部空格
" Java ".stripTrailing();  // " Java"  
//重復(fù)字符串多少次
"Java".repeat(3);             // "JavaJavaJava"  

//返回由行終止符分隔的字符串集合。
"A\nB\nC".lines().count();    // 3 
"A\nB\nC".lines().collect(Collectors.toList()); 

ZGC:可伸縮低延遲垃圾收集器

ZGC 即 Z Garbage Collector,是一個(gè)可伸縮的、低延遲的垃圾收集器。

ZGC 主要為了滿(mǎn)足如下目標(biāo)進(jìn)行設(shè)計(jì):

  • GC 停頓時(shí)間不超過(guò) 10ms
  • 即能處理幾百 MB 的小堆,也能處理幾個(gè) TB 的大堆
  • 應(yīng)用吞吐能力不會(huì)下降超過(guò) 15%(與 G1 回收算法相比)
  • 方便在此基礎(chǔ)上引入新的 GC 特性和利用 colord
  • 針以及 Load barriers 優(yōu)化奠定基礎(chǔ)
  • 當(dāng)前只支持 Linux/x64 位平臺(tái)

ZGC 目前 處在實(shí)驗(yàn)階段,只支持 Linux/x64 平臺(tái)

標(biāo)準(zhǔn) HTTP Client 升級(jí)

Java 11 對(duì) Java 9 中引入并在 Java 10 中進(jìn)行了更新的 Http Client API 進(jìn)行了標(biāo)準(zhǔn)化,在前兩個(gè)版本中進(jìn)行孵化的同時(shí),Http Client 幾乎被完全重寫(xiě),并且現(xiàn)在完全支持異步非阻塞。

并且,Java11 中,Http Client 的包名由 jdk.incubator.http 改為java.net.http,該 API 通過(guò) CompleteableFuture 提供非阻塞請(qǐng)求和響應(yīng)語(yǔ)義。

使用起來(lái)也很簡(jiǎn)單,如下:

var request = HttpRequest.newBuilder()  

    .uri(URI.create("https://javastack.cn"))  

    .GET()  

    .build();  

var client = HttpClient.newHttpClient();  

// 同步  

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());  

System.out.println(response.body());  

// 異步  

client.sendAsync(request, HttpResponse.BodyHandlers.ofString())  

    .thenApply(HttpResponse::body)  

    .thenAccept(System.out::println); 

簡(jiǎn)化啟動(dòng)單個(gè)源代碼文件的方法

  • 增強(qiáng)了 Java 啟動(dòng)器,使其能夠運(yùn)行單一文件的 Java 源代碼。此功能允許使用 Java 解釋器直接執(zhí)行 Java 源代碼。源代碼在內(nèi)存中編譯,然后由解釋器執(zhí)行。唯一的約束在于所有相關(guān)的類(lèi)必須定義在同一個(gè) Java 文件中
  • 對(duì)于 Java 初學(xué)者并希望嘗試簡(jiǎn)單程序的人特別有用,并且能和 jshell 一起使用
  • 一定能程度上增強(qiáng)了使用 Java 來(lái)寫(xiě)腳本程序的能力

用于 Lambda 參數(shù)的局部變量語(yǔ)法

  • 從 Java 10 開(kāi)始,便引入了局部變量類(lèi)型推斷這一關(guān)鍵特性。類(lèi)型推斷允許使用關(guān)鍵字 var 作為局部變量的類(lèi)型而不是實(shí)際類(lèi)型,編譯器根據(jù)分配給變量的值推斷出類(lèi)型
  • Java 10 中對(duì) var 關(guān)鍵字存在幾個(gè)限制
    • 只能用于局部變量上
    • 聲明時(shí)必須初始化
    • 不能用作方法參數(shù)
    • 不能在 Lambda 表達(dá)式中使用
  • Java11 開(kāi)始允許開(kāi)發(fā)者在 Lambda 表達(dá)式中使用 var 進(jìn)行參數(shù)聲明

其他特性

  • 新的垃圾回收器 Epsilon,一個(gè)完全消極的 GC 實(shí)現(xiàn),分配有限的內(nèi)存資源,最大限度的降低內(nèi)存占用和內(nèi)存吞吐延遲時(shí)間
  • 低開(kāi)銷(xiāo)的 Heap Profiling:Java 11 中提供一種低開(kāi)銷(xiāo)的 Java 堆分配采樣方法,能夠得到堆分配的 Java 對(duì)象信息,并且能夠通過(guò) JVMTI 訪(fǎng)問(wèn)堆信息
  • TLS1.3 協(xié)議:Java 11 中包含了傳輸層安全性(TLS)1.3 規(guī)范(RFC 8446)的實(shí)現(xiàn),替換了之前版本中包含的 TLS,包括 TLS 1.2,同時(shí)還改進(jìn)了其他 TLS 功能,例如 OCSP 裝訂擴(kuò)展(RFC 6066,RFC 6961),以及會(huì)話(huà)散列和擴(kuò)展主密鑰擴(kuò)展(RFC 7627),在安全性和性能方面也做了很多提升
  • 飛行記錄器:飛行記錄器之前是商業(yè)版 JDK 的一項(xiàng)分析工具,但在 Java 11 中,其代碼被包含到公開(kāi)代碼庫(kù)中,這樣所有人都能使用該功能了

Java12

增強(qiáng) Switch

  • 傳統(tǒng)的 switch 語(yǔ)法存在容易漏寫(xiě) break 的問(wèn)題,而且從代碼整潔性層面來(lái)看,多個(gè) break 本質(zhì)也是一種重復(fù)

  • Java12 提供了 swtich 表達(dá)式,使用類(lèi)似 lambda 語(yǔ)法條件匹配成功后的執(zhí)行塊,不需要多寫(xiě) break

  • 作為預(yù)覽特性加入,需要在javac編譯和java運(yùn)行時(shí)增加參數(shù)--enable-preview

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

數(shù)字格式化工具類(lèi)

  • NumberFormat 新增了對(duì)復(fù)雜的數(shù)字進(jìn)行格式化的支持

    NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
    String result = fmt.format(1000);
     System.out.println(result); // 輸出為 1K,計(jì)算工資是多少K更方便了。。。
    

Shenandoah GC

  • Redhat 主導(dǎo)開(kāi)發(fā)的 Pauseless GC 實(shí)現(xiàn),主要目標(biāo)是 99.9% 的暫停小于 10ms,暫停與堆大小無(wú)關(guān)等
  • 和 Java11 開(kāi)源的 ZGC 相比(需要升級(jí)到 JDK11 才能使用),Shenandoah GC 有穩(wěn)定的 JDK8u 版本,在 Java8 占據(jù)主要市場(chǎng)份額的今天有更大的可落地性

G1 收集器提升

  • Java12 為默認(rèn)的垃圾收集器 G1 帶來(lái)了兩項(xiàng)更新:
    • 可中止的混合收集集合:JEP344 的實(shí)現(xiàn),為了達(dá)到用戶(hù)提供的停頓時(shí)間目標(biāo),JEP 344 通過(guò)把要被回收的區(qū)域集(混合收集集合)拆分為強(qiáng)制和可選部分,使 G1 垃圾回收器能中止垃圾回收過(guò)程。 G1 可以中止可選部分的回收以達(dá)到停頓時(shí)間目標(biāo)
    • 及時(shí)返回未使用的已分配內(nèi)存:JEP346 的實(shí)現(xiàn),增強(qiáng) G1 GC,以便在空閑時(shí)自動(dòng)將 Java 堆內(nèi)存返回給操作系統(tǒng)

Java13

引入 yield 關(guān)鍵字到 Switch 中

  • Switch 表達(dá)式中就多了一個(gè)關(guān)鍵字用于跳出 Switch 塊的關(guān)鍵字 yield,主要用于返回一個(gè)值

  • yieldreturn 的區(qū)別在于:return 會(huì)直接跳出當(dāng)前循環(huán)或者方法,而 yield 只會(huì)跳出當(dāng)前 Switch 塊,同時(shí)在使用 yield 時(shí),需要有 default 條件

     private static String descLanguage(String name) {
            return switch (name) {
                case "Java": yield "object-oriented, platform independent and secured";
                case "Ruby": yield "a programmer's best friend";
                default: yield name +" is a good language";
            };
     }
    

文本塊

  • 解決 Java 定義多行字符串時(shí)只能通過(guò)換行轉(zhuǎn)義或者換行連接符來(lái)變通支持的問(wèn)題,引入三重雙引號(hào)來(lái)定義多行文本

  • 兩個(gè)"""中間的任何內(nèi)容都會(huì)被解釋為字符串的一部分,包括換行符

    String json ="{\n" +
                  "   \"name\":\"mkyong\",\n" +
                  "   \"age\":38\n" +
                  "}\n";   // 未支持文本塊之前
    
     String json = """
                    {
                        "name":"mkyong",
                        "age":38
                    }
                    """;
    

增強(qiáng) ZGC 釋放未使用內(nèi)存

  • 在 Java 11 中是實(shí)驗(yàn)性的引入的 ZGC 在實(shí)際的使用中存在未能主動(dòng)將未使用的內(nèi)存釋放給操作系統(tǒng)的問(wèn)題
  • ZGC 堆由一組稱(chēng)為 ZPages 的堆區(qū)域組成。在 GC 周期中清空 ZPages 區(qū)域時(shí),它們將被釋放并返回到頁(yè)面緩存 ZPageCache 中,此緩存中的 ZPages 按最近最少使用(LRU)的順序,并按照大小進(jìn)行組織
  • 在 Java 13 中,ZGC 將向操作系統(tǒng)返回被標(biāo)識(shí)為長(zhǎng)時(shí)間未使用的頁(yè)面,這樣它們將可以被其他進(jìn)程重用

SocketAPI 重構(gòu)

  • Java 13 為 Socket API 帶來(lái)了新的底層實(shí)現(xiàn)方法,并且在 Java 13 中是默認(rèn)使用新的 Socket 實(shí)現(xiàn),使其易于發(fā)現(xiàn)并在排除問(wèn)題同時(shí)增加可維護(hù)性

動(dòng)態(tài)應(yīng)用程序類(lèi)-數(shù)據(jù)共享

  • Java 13 中對(duì) Java 10 中引入的 應(yīng)用程序類(lèi)數(shù)據(jù)共享進(jìn)行了進(jìn)一步的簡(jiǎn)化、改進(jìn)和擴(kuò)展,即:允許在 Java 應(yīng)用程序執(zhí)行結(jié)束時(shí)動(dòng)態(tài)進(jìn)行類(lèi)歸檔,具體能夠被歸檔的類(lèi)包括:所有已被加載,但不屬于默認(rèn)基層 CDS 的應(yīng)用程序類(lèi)和引用類(lèi)庫(kù)中的類(lèi)

Java14

record 關(guān)鍵字

  • 簡(jiǎn)化數(shù)據(jù)類(lèi)的定義方式,使用 record 代替 class 定義的類(lèi),只需要聲明屬性,就可以在獲得屬性的訪(fǎng)問(wèn)方法,以及 toString,hashCode,equals 方法

  • 類(lèi)似于使用 Class 定義類(lèi),同時(shí)使用了 lomobok 插件,并打上了@Getter,@ToString,@EqualsAndHashCode注解

  • 作為預(yù)覽特性引入

    /**
     * 這個(gè)類(lèi)具有兩個(gè)特征
     * 1\. 所有成員屬性都是final
     * 2\. 全部方法由構(gòu)造方法,和兩個(gè)成員屬性訪(fǎng)問(wèn)器組成(共三個(gè))
     * 那么這種類(lèi)就很適合使用record來(lái)聲明
     */
    final class Rectangle implements Shape {
        final double length;
        final double width;
    
        public Rectangle(double length, double width) {
            this.length = length;
            this.width = width;
        }
    
        double length() { return length; }
        double width() { return width; }
    }
    /**
     * 1\. 使用record聲明的類(lèi)會(huì)自動(dòng)擁有上面類(lèi)中的三個(gè)方法
     * 2\. 在這基礎(chǔ)上還附贈(zèng)了equals(),hashCode()方法以及toString()方法
     * 3\. toString方法中包括所有成員屬性的字符串表示形式及其名稱(chēng)
     */
    record Rectangle(float length, float width) { }
    

空指針異常精準(zhǔn)提示

  • 通過(guò) JVM 參數(shù)中添加-XX:+ShowCodeDetailsInExceptionMessages,可以在空指針異常中獲取更為詳細(xì)的調(diào)用信息,更快的定位和解決問(wèn)題

    a.b.c.i = 99; // 假設(shè)這段代碼會(huì)發(fā)生空指針
    
    Exception in thread "main" java.lang.NullPointerException:
            Cannot read field 'c' because 'a.b' is null.
        at Prog.main(Prog.java:5) // 增加參數(shù)后提示的異常中很明確的告知了哪里為空導(dǎo)致
    

switch 的增強(qiáng)終于轉(zhuǎn)正

  • JDK12 引入的 switch(預(yù)覽特性)在 JDK14 變?yōu)檎桨姹?,不需要增加參?shù)來(lái)啟用,直接在 JDK14 中就能使用
  • 主要是用->來(lái)替代以前的:+break;另外就是提供了 yield 來(lái)在 block 中返回值

Before Java 14

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

Java 14 enhancements

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

instanceof 增強(qiáng)

  • instanceof 主要在類(lèi)型強(qiáng)轉(zhuǎn)前探測(cè)對(duì)象的具體類(lèi)型,然后執(zhí)行具體的強(qiáng)轉(zhuǎn)

  • 新版的 instanceof 可以在判斷的是否屬于具體的類(lèi)型同時(shí)完成轉(zhuǎn)換

Object obj = "我是字符串";
if(obj instanceof String str){
    System.out.println(str);
}

其他特性

  • 從 Java11 引入的 ZGC 作為繼 G1 過(guò)后的下一代 GC 算法,從支持 Linux 平臺(tái)到 Java14 開(kāi)始支持 MacOS 和 Window(個(gè)人感覺(jué)是終于可以在日常開(kāi)發(fā)工具中先體驗(yàn)下 ZGC 的效果了,雖然其實(shí) G1 也夠用)
  • 移除了 CMS 垃圾收集器(功成而退)
  • 新增了 jpackage 工具,標(biāo)配將應(yīng)用打成 jar 包外,還支持不同平臺(tái)的特性包,比如 linux 下的debrpm,window 平臺(tái)下的msiexe

總結(jié)

關(guān)于預(yù)覽特性

  • 先貼一段 oracle 官網(wǎng)原文:This is a preview feature, which is a feature whose design, specification, and implementation are complete, but is not permanent, which means that the feature may exist in a different form or not at all in future JDK releases. To compile and run code that contains preview features, you must specify additional command-line options.
  • 這是一個(gè)預(yù)覽功能,該功能的設(shè)計(jì),規(guī)格和實(shí)現(xiàn)是完整的,但不是永久性的,這意味著該功能可能以其他形式存在或在將來(lái)的 JDK 版本中根本不存在。 要編譯和運(yùn)行包含預(yù)覽功能的代碼,必須指定其他命令行選項(xiàng)。
  • 就以switch的增強(qiáng)為例子,從 Java12 中推出,到 Java13 中將繼續(xù)增強(qiáng),直到 Java14 才正式轉(zhuǎn)正進(jìn)入 JDK 可以放心使用,不用考慮后續(xù) JDK 版本對(duì)其的改動(dòng)或修改
  • 一方面可以看出 JDK 作為標(biāo)準(zhǔn)平臺(tái)在增加新特性的嚴(yán)謹(jǐn)態(tài)度,另一方面?zhèn)€人認(rèn)為是對(duì)于預(yù)覽特性應(yīng)該采取審慎使用的態(tài)度。特性的設(shè)計(jì)和實(shí)現(xiàn)容易,但是其實(shí)際價(jià)值依然需要在使用中去驗(yàn)證

JVM 虛擬機(jī)優(yōu)化

  • 每次 Java 版本的發(fā)布都伴隨著對(duì) JVM 虛擬機(jī)的優(yōu)化,包括對(duì)現(xiàn)有垃圾回收算法的改進(jìn),引入新的垃圾回收算法,移除老舊的不再適用于今天的垃圾回收算法等
  • 整體優(yōu)化的方向是高效,低時(shí)延的垃圾回收表現(xiàn)
  • 對(duì)于日常的應(yīng)用開(kāi)發(fā)者可能比較關(guān)注新的語(yǔ)法特性,但是從一個(gè)公司角度來(lái)說(shuō),在考慮是否升級(jí) Java 平臺(tái)時(shí)更加考慮的是JVM 運(yùn)行時(shí)的提升

參考信息

作者:Snailclimb
鏈接:一文帶你看遍 JDK9~14 的重要新特性!
來(lái)源:github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容