jdk 9 新特性
1.集合加強
jdk9 為所有集合(List/Set/Map)都增加了 of 和 copyOf 方法,用來創建不可變集合,即一旦創建就無法再執行添加、刪除、替換、排序等操作,否則將報錯: java.lang.UnsupportedOperationException 異常。
一般在特定場景下使用。
List strs = List.of("Hello", "World"); List strsCopy = List. copyOf(strs); Set strs = Set.of("Hello", "World"); Map maps = Map.of("Hello", 1, "World", 2);
2.私有接口方法
jdk 8 提供了默認方法(Default) 和靜態方法,打破了之前接口只能定義方法而不能存在行為。jdk 9 則允許接口定義私有方法。私有方法可以作為通用方法放在默認方法調用,不過實際中並無太大用處。
3.垃圾收集機制
jdk 9 把G1 作為默認的垃圾手機器實現。替換了 jdk 7 和 jdk8 的默認垃圾收集器實現: Parallel Scavenge(新生代) + Parallel Old(老年代)
4. I/O 流加強
java.io.InputStream 中增加了新的方法來讀取和復制 InputStream 中包含的數據
readAllBytes: 讀取 InputStream 中的所有剩余字節
readNBytes: 從InputStream 中讀取指定數量的字節到數組中
transferTo: 讀取InputStream 中全部字節寫入到指定的 OutputStream 中
5.Jshell 工具
jdk9 引入了 jshell 這個交互性工具,讓 java 也可以像腳本語言一樣來允許,可以從控制台啟動 jshell ,在 jshell 中直接輸入表達式並查看其執行結果。當需要測試一個方法的運行效果,或是快速的對表達式進行求值時,jshell 都非常實用。
jdk 10 新特性
1.局部變量類型推斷
局部變量類型推斷可以說是jdk10中最值得注意的特性,這是Java語言開發人員為了簡化Java應用程序的編寫而采取的又一步,舉個例子:
原先我們需要這么定義一個list
List<String> list = new ArrayList<>();
使用局部類型推斷var關鍵詞定義
var list = new ArrayList<String>();
不過局部變量類型推斷僅僅適用在:
有初始化值的局部變量
增強 for 循環中的索引
傳統 for 循環中聲明的局部變量
Oracle 的 Java 團隊申明,以下不支持局部變量類型推斷:
方法參數
構造函數參數
方法返回類型
字段
catch 代碼塊(或任何其他類型的變量聲明)
2.線程本地握手
jdk10將引入一種在線程上執行回調的新方法,因此這將會很方便能停止單個線程而不是停止全部線程或者一個都不停
3.GC改進和內存管理
jdk10中有2個JEP專門用於改進當前的垃圾收集元素。
第一個垃圾收集器接口是(JEP 304),它將引入一個純凈的垃圾收集器接口,以幫助改進不同垃圾收集器的源代碼隔離。
預定用於Java 10的第二個JEP是針對G1的並行完全GC(JEP 307),其重點在於通過完全GC並行來改善G1最壞情況的等待時間。G1是Java 9中的默認GC,並且此JEP的目標是使G1平行。
jdk 11 新特性
1. 字符串加強
// 判斷字符串是否為空白 " ".isBlank(); // true // 去除首尾空格 " Javastack ".strip(); // "Javastack" // 去除尾部空格 " Javastack ".stripTrailing(); // 去除首部空格 " Javastack ".stripLeading(); // "Javastack " // 復制字符串 "Java".repeat(3); // "JavaJavaJava" // 行數統計 "A\nB\nC".lines().count(); // 3
2. HttpClient API
這是 Java 9 開始引入的一個處理 HTTP 請求的的孵化 HTTP Client API,該 API 支持同步和異步,而在 Java 11 中已經為正式可用狀態,你可以在java.net包中找到這個 Api
3. 用於 Lambda 參數的局部變量語法
用於 Lambda 參數的局部變量語法簡單來說就是支持類型推導:
var x = new A();
for (var x : xs) { ... }
try (var x = ...) { ... } catch ...
4.ZGC
從JDK 9開始,JDK使用G1作為默認的垃圾回收器。G1可以說是GC的一個里程碑,G1之前的GC回收,還是基於固定的內存區域,而G1采用了一種“細粒度”的內存管理策略,不在固定的區分內存區域屬於surviors、eden、old,而我們不需要再去對於年輕代使用一種回收策略,老年代使用一種回收策略,取而代之的是一種整體的內存回收策略。這種回收策略在我們當下cpu、內存、服務規模都越來越大的情況下提供了更好的表現,而這一代ZGC更是有了突破性的進步。
從原理上來理解,ZGC可以看做是G1之上更細粒度的內存管理策略。由於內存的不斷分配回收會產生大量的內存碎片空間,因此需要整理策略防止內存空間碎片化,在整理期間需要將對於內存引用的線程邏輯暫停,這個過程被稱為"Stop the world"。只有當整理完成后,線程邏輯才可以繼續運行,一般而言,主要有如下幾種方式優化"Stop the world":
使用多個線程同時回收(並行回收)
回收過程分為多次停頓(增量回收)
在程序運行期間回收,不需要停頓或只停頓很短時間(並發回收)
只回收內存而不整理內存
ZGC主要采用的是並發回收的策略,相較於G1 ZGC最主要的提升是使用Load Barrier技術實現,引用R大對於ZGC的評價:
與標記對象的傳統算法相比,ZGC在指針上做標記,在訪問指針時加入Load Barrier(讀屏障),比如當對象正被GC移動,指針上的顏色就會不對,這個屏障就會先把指針更新為有效地址再返回,也就是,永遠只有單個對象讀取時有概率被減速,而不存在為了保持應用與GC一致而粗暴整體的Stop The World。
jdk 12新特性
1. Switch Expressions
Switch Expressions 或者說起相關的 Pattern Matching 特性,為我們提供了勾勒出了 Java 語法進化的一個趨勢,將開發者從復雜繁瑣的低層次抽象中逐漸解放出來,以更高層次更優雅的抽象,既降低代碼量,又避免意外編程錯誤的出現,進而提高代碼質量和開發效率
2.Shenandoah GC
新增了一個名為 Shenandoah 的 GC 算法,通過與正在運行的 Java 線程同時進行 evacuation 工作來減少 GC 暫停時間。使用 Shenandoah 的暫停時間與堆大小無關,這意味着無論堆是 200 MB 還是 200 GB,都將具有相同的暫停時間。
jdk 13 新特性
JDK13中包含的5個特性,能夠改變開發者的編碼風格的主要有Text Blocks和Switch Expressions兩個新特性,但是這兩個特性還處於預覽階段。
而且,JDK13並不是LTS(長期支持)版本,如果你正在使用Java 8(LTS)或者Java 11(LTS),暫時可以不必升級到Java 13.
各個版本發布時間
jdk 12 時間: 2019-3-19
jdk 13 時間: 2019 - 9 -17
特性總結:
JDK1.4 正則表達式,異常鏈,NIO,日志類,XML解析器,XLST轉換器 JDK1.5 自動裝箱、泛型、動態注解、枚舉、可變長參數、遍歷循環 JDK1.6 提供動態語言支持、提供編譯API和衛星HTTP服務器API,改進JVM的鎖,同步垃圾回收,類加載 JDK1.7 提供GI收集器、加強對非Java語言的調用支持(JSR-292,升級類加載架構 JDK1.8 Lambda 表達式、方法引用、默認方法、新工具、Stream API、Date Time API 、Optional 類、Nashorn, JavaScript 引擎
參考:https://blog.csdn.net/jlq_diligence/article/details/102775215
參考:https://blog.csdn.net/J080624/article/details/85259041