Java 9 逆天的十大新特性

Java 9 逆天的十大新特性

modularity System 模塊系統

Java 9 中主要的變化是已經實現的模塊化系統。

Modularity 提供了類似於 OSGI 框架的功能,模塊之間存在相互的依賴關係,可以導出一個公共的 API,並且隱藏實現的細節,Java 提供該功能的主要的動機在於,減少內存的開銷,在 JVM 啟動的時候,至少會有 30~60MB 的內存加載,主要原因是 JVM 需要加載 rt.jar,不管其中的類是否被 classloader 加載,第一步整個 jar 都會被 JVM 加載到內存當中去,模塊化可以根據模塊的需要加載程序運行需要的 class。

在引入了模塊系統之後,JDK 被重新組織成 94 個模塊。Java 應用可以通過新增的 jlink 工具,創建出只包含所依賴的 JDK 模塊的自定義運行時鏡像。這樣可以極大的減少 Java 運行時環境的大小。使得 JDK 可以在更小的設備中使用。採用模塊化系統的應用程序只需要這些應用程序所需的那部分 JDK 模塊,而非是整個 JDK 框架了。

HTTP/2

JDK9 之前提供 HttpURLConnection API 來實現 HTTP 訪問功能,但是這個類基本很少使用,一般都會選擇 Apache 的 HttpClient,此次在 Java 9 的版本中引入了一個新的 package:java.net.http,裡面提供了對 HTTP 訪問很好的支持,不僅支持 HTTP 1.1 而且還支持 HTTP 2(什麼是 HTTP2?請參見 HTTP2 的時代來了...),以及 WebSocket,據說性能特別好。

Java 9 逆天的十大新特性

注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器模塊交付。也就是說,這套 API 不能保證 100% 完成。

JShell

用過 Python 的童鞋都知道,Python 中的讀取-求值-打印循環( Read-Evaluation-Print Loop )很方便。它的目的在於以即時結果和反饋的形式。

Java9 引入了 JShell 這個交互性工具,讓 Java 也可以像腳本語言一樣來運行,可以從控制檯啟動 JShell ,在 JShell 中直接輸入表達式並查看其執行結果。當需要測試一個方法的運行效果,或是快速的對錶達式進行求值時,JShell 都非常實用。

除了表達式之外,還可以創建 Java 類和方法。jshell 也有基本的代碼完成功能。我們在教人們如何編寫 Java 的過程中,不再需要解釋 “public static void main(String [] args)” 這句廢話。

Java 9 逆天的十大新特性

不可變集合工廠方法

Java 9 增加了 List.of()、Set.of()、Map.of()

Map.ofEntries()等工廠方法來創建不可變集合。

Java 9 逆天的十大新特性

除了更短和更好閱讀之外,這些方法也可以避免您選擇特定的集合實現。在創建後,繼續添加元素到這些集合會導致 “UnsupportedOperationException”。

私有接口方法

Java 8 為我們提供了接口的默認方法和靜態方法,接口也可以包含行為,而不僅僅是方法定義。

默認方法和靜態方法可以共享接口中的私有方法,因此避免了代碼冗餘,這也使代碼更加清晰。如果私有方法是靜態的,那這個方法就屬於這個接口的。並且沒有靜態的私有方法只能被在接口中的實例調用。

Java 9 逆天的十大新特性

HTML5 風格的 Java 幫助文檔

Java 8 之前的版本生成的 Java 幫助文檔是在 HTML 4 中。在 Java 9 中,Javadoc 的輸出現在符合兼容 HTML5 標準。現在 HTML 4 是默認的輸出標記語言,但是在之後發佈的 JDK 中,HTML 5 將會是默認的輸出標記語言。

Java 幫助文檔還是由三個框架組成的結構構成,這是不會變的,並且以 HTML 5 輸出的 Java 幫助文檔也保持相同的結構。每個 Javadoc 頁面都包含有關 JDK 模塊類或接口來源的信息。

Java 9 逆天的十大新特性

多版本兼容 JAR

當一個新版本的 Java 出現的時候,你的庫用戶要花費很長時間才會切換到這個新的版本。這就意味著庫要去向後兼容你想要支持的最老的 Java 版本 (許多情況下就是 Java 6 或者 7)。這實際上意味著未來的很長一段時間,你都不能在庫中運用 Java 9 所提供的新特性。幸運的是,多版本兼容 JAR 功能能讓你創建僅在特定版本的 Java 環境中運行庫程序時選擇使用的 class 版本:

Java 9 逆天的十大新特性

在上述場景中,multirelease.jar 可以在 Java 9 中使用, 不過 Helper 這個類使用的不是頂層的 multirelease.Helper 這個 class, 而是處在“META-INF/versions/9”下面的這個。這是特別為 Java 9 準備的 class 版本,可以運用 Java 9 所提供的特性和庫。同時,在早期的 Java 諸版本中使用這個 JAR 也是能運行的,因為較老版本的 Java 只會看到頂層的這個 Helper 類。

統一 JVM 日誌

Java 9 中 ,JVM 有了統一的日誌記錄系統,可以使用新的命令行選項-Xlog 來控制 JVM 上 所有組件的日誌記錄。該日誌記錄系統可以設置輸出的日誌消息的標籤、級別、修飾符和輸出目標等。

Java 9 的垃圾收集機制

Java 9 移除了在 Java 8 中 被廢棄的垃圾回收器配置組合,同時把 G1 設為默認的垃圾回收器實現。替代了之前默認使用的 Parallel GC,對於這個改變,evens 的評論是醬紫的:這項變更是很重要的,因為相對於 Parallel 來說,G1 會在應用線程上做更多的事情,而 Parallel 幾乎沒有在應用線程上做任何事情,它基本上完全依賴 GC 線程完成所有的內存管理。這意味著切換到 G1 將會為應用線程帶來額外的工作,從而直接影響到應用的性能。

I/O 流新特性

java.io.InputStream 中增加了新的方法來讀取和複製 InputStream 中包含的數據。

  • readAllBytes:讀取 InputStream 中的所有剩餘字節;

  • readNBytes: 從 InputStream 中讀取指定數量的字節到數組中;

  • transferTo:讀取 InputStream 中的全部字節並寫入到指定的 OutputStream 中。


分享到:


相關文章: