閑談Java9到Java20,你學會了嗎?
一、概述
自從java9開始商用后,到現在一直停留在java8上。去年偶然看過說java17之后開始不商用了,而且springboot3和spring6最低要求JDK17,奈何太忙了一直沒時間去梳理。趁現在這段時間得空,從9開始到20,逐個的去梳理下,看看有哪些變化。當然了,限于個人能力有限,本文非正式說明,只是個人見解,不可當真。
先來個歷代特性數圖,心里有個大致的認知。
二、各版本簡介
2.1 JDK9
JDK9特性數最多的原因是這個版本引入了模塊化概念對JRE進行了優化,目錄結構和之前有很大不同。
還增加了一個jshell命令,實現在命令行也能快速執行java代碼的功能,對于一些簡單的main方法測試,但又不想建立工程來說,確實是比較方便。
java8的時候對接口進行了改動,使接口可以編寫方法體。java9對這一功能進行了升級,增加支持私有方法。
try-resource也進行了升級,可以直接傳入句柄不用再轉換了。
String類的底層由char數組換成了byte數據,節省了空間和提高了性能。
另外,java9自己實現了一套httpclient不用再引用第三方實現了。
2.2 JDK10
G1終于正名了,java10開始,G1成為默認垃圾回收器。
增加了一個關鍵詞:var,不同于js的var,java的var是個語法糖,依據上下文推斷,推測出具體類型,實際編譯時依然是原本類型。
集合增加了copyOf方法,可以復制出一個不可變的集合出來。
2.3 JDK11
擴大了var關鍵詞的應用范圍。
String增加類似trim的實用方法,可以不用再用lang3包實現了。
豐富了java9的httpclient包的方法。
引入了一個新的垃圾回收器:Epsilon。
2.4 JDK12
switch表達式優化1.0版,支持case多個字段
同時還支持將switvh結果賦值給對象上
2.5 JDK一三(為啥敏感詞?)
支持了python的文本塊功能,大文本字符串再也不會亂了,尤其是使用mybatis注解方式的,SQL看起來會更清晰。
switch表達式優化1.1版,其實和java12寫法沒啥區別。
2.6 JDK14
switch表達式優化終版。
增加了Record類型的類,類似VO,但只提供getter不提供setter,對于javaee來說缺少setter是不香的。
instaceof初版優化,增加句柄,簡化類型強制轉換的操作,使代碼看著更整潔。
2.7 JDK15
增加關鍵詞sealed,相比于final,sealed允許指定的類繼承。
2.8 JDK16
instaceof優化定版。
增加Vector向量計算類。
2.9 JDK17(LTS)
注意:自本版本開始,java恢復免費了。并且java17類似java8是個長期支持的版本。
支持蘋果的M系列芯片。
Switch支持類型推導了,不再限定數值、字符串了,同時還支持了case null。
2.10 JDK18
默認UTF-8位默認編碼
增加jwebserver命令工具,可以直接啟動一個簡單的web服務。
javadoc支持新的注解,但是好像沒啥用。
重寫了反射,提高了反射性能。
switch又增強了,支持復雜的lamda表達式和類型推導。
2.11 JDK19
引入了虛擬線程,提高并發性能。
2.12 JDK20
java20多是對之前預覽或者改進中的功能繼續完善,沒有更多的新功能。
3、JDK21
java21將是繼17之后的另一個LTS版本,目前規劃的有5個新特性。建議還停留在1.8的可以升級到17,已升級到17的,再等幾個月升級到21。總而言之,java9~20是個不斷吸取他人長處彌補自己短處的過程,java在進步,我們也是時候更近一步了。