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、dropWhile、takeWhile和iterate方法。Collectors中增加了新的方法filtering和flatMapping -
Optional類(lèi)中新增了ifPresentOrElse、or和stream等方法
進(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.Publisher、Flow.Subscriber、Flow.Subscription和Flow.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-previewswitch (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è)值-
yield和return的區(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 下的
deb和rpm,window 平臺(tái)下的msi和exe
總結(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í)的提升
參考信息
- IBM Developer Java9 https://www.ibm.com/developerworks/cn/java/the-new-features-of-Java-9/
- Guide to Java10 https://www.baeldung.com/java-10-overview
- Java 10 新特性介紹https://www.ibm.com/developerworks/cn/java/the-new-features-of-Java-10/index.html
- IBM Devloper Java11 https://www.ibm.com/developerworks/cn/java/the-new-features-of-Java-11/index.html
- Java 11 – Features and Comparison: https://www.geeksforgeeks.org/java-11-features-and-comparison/
- Oracle Java12 ReleaseNote https://www.oracle.com/technetwork/java/javase/12all-relnotes-5211423.html#NewFeature
- Oracle Java13 ReleaseNote https://www.oracle.com/technetwork/java/javase/13all-relnotes-5461743.html#NewFeature
- New Java13 Features https://www.baeldung.com/java-13-new-features
- Java13 新特性概述 https://www.ibm.com/developerworks/cn/java/the-new-features-of-Java-13/index.html
- Oracle Java14 record https://docs.oracle.com/en/java/javase/14/language/records.html
- java14-features https://www.techgeeknext.com/java/java14-features
- 《2020最新Java基礎(chǔ)精講視頻教程和學(xué)習(xí)路線(xiàn)!》
作者:Snailclimb
鏈接:一文帶你看遍 JDK9~14 的重要新特性!
來(lái)源:github