Java 9 ← 2017,2019 Java → 13 ,都發生了什麼?
距離 2019 年結束,只剩下 30 幾天了。你做好準備迎接 2020 年了嗎?
一到年底,人就特別容易陷入回憶和比較之中,比如說這幾天, 的對比挑戰就火了!
這個話題登上了微博的熱搜榜,也刷爆了朋友圈,人們紛紛晒出自己2017和2019的照片對比。
作為一個技術宅,我也做了一個對比:
2017 年 9 月 21 日,Java 9 正式釋出,並且在2017年8月,JCP執行委員會提出將Java的釋出頻率改為每六個月一次,新的釋出週期嚴格遵循時間點,將在每年的3月份和9月份釋出。
歷任JDK對比
Java 9 於 2017 年 9 月 22 日正式釋出,帶來了很多新特性,其中最主要的變化是已經實現的模組化系統。
主要特性:
- 模組系統:模組是一個包的容器,Java 9 最大的變化之一是引入了模組系統(Jigsaw 專案)。
- HTTP 2 客戶端:HTTP/2標準是HTTP協議的最新版本,新的 HTTPClient API 支援 WebSocket 和 HTTP2 流以及伺服器推送特性。
- 改進的 Javadoc:Javadoc 現在支援在 API 檔案中的進行搜尋。另外,Javadoc 的輸出現在符合相容 HTML5 標準。
- 集合工廠方法:List,Set 和 Map 介面中,新的靜態工廠方法可以建立這些集合的不可變例項。
- 私有介面方法:在介面中使用private私有方法。我們可以使用 private 訪問修飾符在介面中編寫私有方法。
- 改進的 Stream API:改進的 Stream API 添加了一些便利的方法,使流處理更容易,並使用收集器編寫複雜的查詢。
- 改進 try-with-resources:如果你已經有一個資源是 final 或等效於 final 變數,您可以在 try-with-resources 語句中使用該變數,而無需在 try-with-resources 語句中宣告一個新變數。
- 改進的棄用註解 @Deprecated:註解 @Deprecated 可以標記 Java API 狀態,可以表示被標記的 API 將會被移除,或者已經破壞。
- 改進 Optional 類:java.util.Optional 添加了很多新的有用方法,Optional 可以直接轉為 stream。
- 響應式流(Reactive Streams) API: Java 9中引入了新的響應式流 API 來支援 Java 9 中的響應式程式設計。
Java 10 於 2018 年3 月21 日正式釋出,這是作為當今使用最廣泛的程式語言之一的Java 語言的第十個大版本。
主要特性:
- 區域性變數型別推斷(Local-Variable Type Inference):使用var關鍵字進行變數宣告,可以進行變數型別的推斷。
- G1的並行Full GC(Parallel Full GC for G1):G1 垃圾回收器的並行完整垃圾回收,實現並行性來改善最壞情況下的延遲。
- 應用程式類資料共享(Application Class-Data Sharing):應用程式類資料 (AppCDS) 共享,通過跨程式共享通用類元資料來減少記憶體佔用空間,和減少啟動時間。
- ThreadLocal握手機制(Thread-Local Handshakes):在不進入到全域性 JVM 安全點 (Safepoint) 的情況下,對執行緒執行回撥。優化可以只停止單個執行緒,而不是停全部執行緒或一個都不停。
Java 11 於 2018 年9 月25 日正式釋出,可在生產環境中使用!這是自 Java 8 後的首個長期支援版本,將支援到2026年。
主要特性:
- ZGC,可擴充套件的低延遲垃圾收集器(ZGC: A Scalable Low-Latency Garbage Collector):ZGC是一款號稱可以保證每次GC的停頓時間不超過10MS的垃圾回收器,並且和當前的預設垃圾回收起G1相比,吞吐量下降不超過15%。
- Epsilon:什麼事也不做的垃圾回收器(Epsilon: A No-Op Garbage Collector):這是一款不做垃圾回收的垃圾回收器。這個垃圾回收器看起來並沒什麼用,主要可以用來進行效能測試、記憶體壓力測試等,Epsilon GC可以作為度量其他垃圾回收器效能的對照組。
- 增強var用法(Local-Variable Syntax for Lambda Parameters):在Java 11中,var可以用來作為Lambda表示式的區域性變數宣告。
Java 12 於 2019 年3 月 19 日正式釋出,自Java 11 這一Long Term Support 版本釋出之後半年的又一次版本更新
主要特性:
- 低暫停時間的 GC(Shenandoah: A Low-Pause-Time Garbage Collector )(Experimental):新增 Shenandoah 演演算法,通過與正在執行的 Java 執行緒同時進行 evacuation 工作來減少 GC 暫停時間。
- Switch 表示式(Switch Expressions):擴充套件了 switch 語句,使其不僅可以作為語句(statement),還可以作為表示式(expression)
- 可中止的 G1 Mixed GC(Abortable Mixed Collections for G1) G1 及時返回未使用的已分配記憶體(Promptly Return Unused Committed Memory from G1):如果 G1 Mixed GC 存在超出暫停目標的可能性,則使其可中止。
Java 13 於 2019 年 9 月 17 日正式釋出,這一版本中引入了文字塊等功能。
主要特性:
- 擴充套件應用程式類-資料共享(Dynamic CDS Archives):以允許在 Java 應用程式執行結束時動態歸檔類。歸檔類將包括預設的基礎層 CDS(class data-sharing)存檔中不存在的所有已載入的應用程式類和庫類。
- 增強 ZGC 以將未使用的堆記憶體返回給作業系統(ZGC: Uncommit Unused Memory): ZGC 可以將未使用的堆記憶體返回給作業系統
- 可在生產環境中使用的 switch 表示式(Switch Expressions):在switch塊中引入了yield語句,用於返回值。
- 將文字塊新增到 Java 語言(Text Blocks):引入多行字串文字,在其中可以放置多行的字串,不需要進行任何轉義。
哪些特性改變你的程式碼方式?
1、本地變數型別推斷
在以前的版本中,我們想定義定義區域性變數時。我們需要在賦值的左側提供顯式型別,並在賦值的右邊提供實現型別,如下面的片段所示:
MyObject value = new MyObject();
List list = new ArrayList();
複製程式碼
在Java 10中,你可以這樣定義物件:
var value = new MyObject();
var list = new ArrayList();
複製程式碼
正如你所看到的,本地變數型別推斷將引入“var”關鍵字,而不需要顯式的規範變數的型別。
switch表示式
在JDK 12中引入了Switch表示式作為預覽特性。在Java 13中又修改了這個特性,引入了yield語句,用於返回值。這意味著,switch表示式(返回值)應該使用yield,switch語句(不返回值)應該使用break。
在以前,我們想要在switch中返回內容,還是比較麻煩的,一般語法如下:
int i;
switch (x) {
case "1":
i=1;
break;
case "2":
i=2;
break;
default:
i = x.length();
break;
}
複製程式碼
在JDK13中使用以下語法:
int i = switch (x) {
case "1" -> 1;
case "2" -> 2;
default -> {
int len = args[1].length();
yield len;
}
};
複製程式碼
或者
int i = switch (x) {
case "1": yield 1;
case "2": yield 2;
default: {
int len = args[1].length();
yield len;
}
};
複製程式碼
3、文字塊支援
text block,文字塊,是一個多行字串文字,它避免了對大多數轉義序列的需要,以可預測的方式自動格式化字串,並在需要時讓開發人員控制格式。
我們以前從外部copy一段文字串到Java中,會被自動轉義,如有一段以下字串:
<html>
<body>
<p>Hello,world</p>
</body>
</html>
複製程式碼
將其複製到Java的字串中,會展示成以下內容:
"<html>\n" +
" <body>\n" +
" <p>Hello,world</p>\n" +
" </body>\n" +
"</html>\n";
複製程式碼
即被自動進行了轉義,這樣的字串看起來不是很直觀,在JDK 13中,就可以使用以下語法了:
"""
<html>
<body>
<p>Hello,world</p>
</body>
</html>
""";
複製程式碼
使用“”“作為文字塊的開始符合結束符,在其中就可以放置多行的字串,不需要進行任何轉義。看起來就十分清爽了。
後話
從2017到2019,不果短短兩年時間,Java就釋出了5個版本。每個版本都會有很多特性出來,這些特性中雖然沒有像Java 8那樣提供函式語言程式設計這樣的重大改變,但是也提供了switch表示式和block text等大家期待已久的特性。
2年過去了,在Java學習的道路上,你進步了嗎?歡迎談談你這兩年的變化。
關於作者:Hollis,一個對Coding有著獨特追求的人,某網際網路公司技術專家,個人技術博主,技術文章全網閱讀量數千萬,《程式設計師的三門課》聯合作者。