前言
JDK12目前已經發布了,而我估計大部分人還在用Jdk8,但做程式開發的必須向前(錢)看,我們來看看JDK12到底能給我們帶來一些什么新的改變,
從JDK10到JDK11,再到JDK12,JDK 12顯然是這些變化中新增功能最少的版本,但少并不意味著弱雞,接下來我們將從Java語法 、類別庫、JVM來具體分析,
Java語法
我認為JDK 12中最突出的新功能是切換運算式:
在JDK 12之前,switch是一個宣告陳述句,在使用的時候,你需要給他一個合適的定義,
在JDK 12中,switch已成為一個運算式,可以很快的撰寫并生成結果, 同時很重要的一點是有很好的兼容性,因此您不需要更改使用switch作為陳述句的任何代碼,
示例如下:
我們將從星期一到星期天的英文單詞列出并計算出每一個單詞的長度,并且把該長度分配給numLetters 變數,
JDK12以前的寫法:
int numLetters;
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
numLetters = 6;
break;
case TUESDAY:
numLetters = 7;
break;
case THURSDAY:
case SATURDAY:
numLetters = 8;
break;
case WEDNESDAY:
numLetters = 9;
break;
default:
throw new IllegalStateException("Huh? " + day);
}
JDK12中的寫法:
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> throw new IllegalStateException("Huh? " + day);
};
JDK12中極大的簡化了switch的寫法,同時使用Lambda運算式運算子->來簡化我們的處理,
類別庫
流處理
Streams中的API有一個新的收集器,由Collectors類提供, 可以使用teeing()方法獲得新的收集器, teeing()方法有三個引數:兩個Collectors 和一個BiFunction,如下圖:

輸入流中的所有值都將傳遞到每個Collectors 中, 每個Collectors 的結果作為引數傳遞給BiFunction并生成最終結果,
示例就是計算平均值的例子
/* Assume Collectors is statically imported */
double average = Stream.of(1, 4, 2, 7, 4, 6, 5)
.collect(teeing(
summingDouble(i -> i),
counting(),
(sum, n) -> sum / n));
第一個Collectors 計算輸入流的總和,而第二個Collectors 計算元素的數量, BiFunction將總和除以元素計數以評估平均值,
java.io
InputStream skipNBytes(long n)
以上代碼會跳過輸入流中n個位元組的資料, 如果n<=0,則不跳過任何位元組,
java.text中
有一個新類CompactNumberFormat , 這是NumberFormat的子類 以緊湊的形式格式化十進制數,
緊湊形式的一個例子是將1,000,000寫為1M,因此代碼中只需要2個而不是9個字符,
JVM
一個低暫停時間的垃圾收集器
新增了一個名為 Shenandoah 的 GC 演算法,通過與正在運行的 Java 執行緒同時進行垃圾收集作業來減少 GC 暫停時間,
G1 垃圾收集器的改進(G1的暫停時間最大的值的控制目標)
G1將堆空間(年輕代和老年代)劃分成區域, 這樣的做法是老年代可以在一次GC中不需要進行垃圾收集, 當G1需要收集時,它會選擇它確定需要收集的區域, 這稱為collection set (集合集) , 在JDK 12之前,一旦在collection set (集合集)上開始作業,那么所有作業都必須完成,基本上是作為原子操作, 這樣做的問題在于,有時候,由于應用程式使用堆空間的方式發生了變化,收集collection set (集合集)的垃圾最侄訓變得太大而且收集時間太長而導致暫停時間目標無法滿足,
在JDK 12中,如果G1識別出這種情況,它將在collection set (集合集)開始作業中途中止收集,這樣就不會影回應用程式繼續為新物件分配空間,這樣的話G1將更好地實作暫停時間的目標,
G1 垃圾收集器的增強
在 JVM中,堆一般會占據很大的記憶體,當它啟動時,它將從底層作業系統虛擬記憶體分配器請求記憶體, 在應用程式運行時,GC會進行如下檢查,發現堆所需的記憶體量并不多,這樣的情況就可以把部分已經分配的記憶體回傳給作業系統以供其他應用程式使用,
在JDK 12中,G1將在應用程式不活躍的期間定期嘗試繼續或觸發并發周期以確定整體Java堆使用情況,未使用的記憶體可以更及時和可預測的方式回傳到作業系統,
新的命令列標志-XX:G1PeriodicGCInterval可用于設定檢查之間的毫秒數,
對于長時間處于空閑狀態的應用程式,該功能將使JVM的記憶體利用率更加充分,
總結
JDK 12提供了不少的新功能和API,switch運算式對開發人員來說是最實用,同時使用 G1的用戶也享受到了改進帶來的好處,我建議大家可以持續關注我,如果一旦有了新的功能發布,我定會快速跟進更新,
資料分享
這是我從某優質機構弄來的一些資料,內容我認為確實稱得上優質二字,如需領取,請點贊這篇文章,關注我然后點擊這里即可免費領取
首先分享一份學習大綱,內容較多,涵蓋了互聯網行業所有的流行以及核心技術,以截圖形式分享:
(億級流量性能調優實戰+一線大廠分布式實戰+架構師筑基必備技能+設計思想開源框架解讀+性能直線提升架構技術+高效存盤讓專案性能起飛+分布式擴展到微服務架構…實在是太多了)

其次分享一些技術知識,以截圖形式分享一部分:
Tomcat架構決議:

演算法訓練+高分寶典:

Spring Cloud+Docker微服務實戰:

最后分享一波面試資料:
切莫死記硬背,小心面試官直接讓你出門右拐
1000道互聯網Java面試題:

Java高級架構面試知識整理:

切莫死記硬背,小心面試官直接讓你出門右拐
1000道互聯網Java面試題:
[外鏈圖片轉存中…(img-HQXzZ2pv-1623728384458)]
Java高級架構面試知識整理:
[外鏈圖片轉存中…(img-ZV0O3A0U-1623728384459)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287950.html
標籤:其他
