Java 9 的十大新特性
本文轉載自公眾號? 互扯程序

Knowledge Sharing
知識分享
現在是資源共享的時代,同樣也是知識分享的時代,如果你覺得本文能學到知識,請把知識與別人分享。
在介紹java9之前,我們先來看看java成立到現在的所有版本。
1990年初,最初被命名為Oak;
1995年5月23日,Java語言誕生;
1996年1月,第一個JDK-JDK1.0誕生;
1996年4月,10個最主要的操作系統供應商申明將在其產品中嵌入Java技術;
1996年9月,約8.3萬個網頁應用了Java技術來制作;
1997年2月18日,JDK1.1發布;
1997年4月2日,JavaOne會議召開,參與者逾一萬人,創當時全球同類會議紀錄;
1997年9月,JavaDeveloperConnection社區成員超過十萬;
1998年2月,JDK1.1被下載超過2,000,000次;
1998年12月8日,Java 2企業平臺J2EE發布;
1999年6月,SUN公司發布Java三個版本:標準版(J2SE)、企業版(J2EE)和微型版(J2ME);
2000年5月8日,JDK1.3發布;
2000年5月29日,JDK1.4發布;
2001年6月5日,Nokia宣布到2003年將出售1億部支持Java的手機;
2001年9月24日,J2EE1.3發布;
2002年2月26日,J2SE1.4發布,此后Java的計算能力有了大幅提升;
2004年9月30日,J2SE1.5發布,成為Java語言發展史上的又一里程碑。為了表示該版本的重要性,J2SE1.5更名為Java SE 5.0;
2005年6月,JavaOne大會召開,SUN公司公開Java SE 6。此時,Java的各種版本已經更名,以取消其中的數字“2”:J2EE更名為Java EE,J2SE更名為Java SE,J2ME更名為Java ME;
2006年12月,SUN公司發布JRE6.0;
2009年4月20日,甲骨文以74億美元的價格收購SUN公司,取得java的版權,業界傳聞說這對Java程序員是個壞消息(其實恰恰相反);
2010年11月,由于甲骨文對Java社區的不友善,因此Apache揚言將退出JCP;
2011年7月28日,甲骨文發布Java SE 7;
2014年3月18日,甲骨文發表Java SE 8;
2017年7月,甲骨文發表Java SE 9。
寫在前面
按照java1995年正式誕生起到現在,已經快23年了。比我年齡都大(我今天剛滿18歲)。java已經陪我走過了十幾個年頭了,當年我用的第一個版本應該是J2SE1.4(完了,暴露了)。其實現在好多人還在用Java SE 6,還有一部分人Java SE 8還沒玩明白呢,Java SE 9已經粉末登場了。在Open JDK的官網上看到了Java 10的標準也在制定當中,Java的發展真的越來越快了。
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的Http Client,此次在Java 9的版本中引入了一個新的package:java.net.http,里面提供了對Http訪問很好的支持,不僅支持Http1.1而且還支持HTTP2(什么是HTTP2?請參見HTTP2的時代來了...),以及WebSocket,據說性能特別好。
注意:新的 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增加了List.of()、Set.of()、Map.of()和Map.ofEntries()等工廠方法來創建不可變集合。
除了更短和更好閱讀之外,這些方法也可以避免您選擇特定的集合實現。在創建后,繼續添加元素到這些集合會導致 “UnsupportedOperationException” 。
私有接口方法
Java 8 為我們提供了接口的默認方法和靜態方法,接口也可以包含行為,而不僅僅是方法定義。
默認方法和靜態方法可以共享接口中的私有方法,因此避免了代碼冗余,這也使代碼更加清晰。如果私有方法是靜態的,那這個方法就屬于這個接口的。并且沒有靜態的私有方法只能被在接口中的實例調用。
HTML5風格的Java幫助文檔
Java 8之前的版本生成的Java幫助文檔是在HTML 4中。在Java 9中,Javadoc 的輸出現在符合兼容 HTML5 標準。現在HTML 4是默認的輸出標記語言,但是在之后發布的JDK中,HTML 5將會是默認的輸出標記語言。
Java幫助文檔還是由三個框架組成的結構構成,這是不會變的,并且以HTML 5輸出的Java幫助文檔也保持相同的結構。每個 Javadoc 頁面都包含有關 JDK 模塊類或接口來源的信息。
多版本兼容 JAR
當一個新版本的 Java 出現的時候,你的庫用戶要花費很長時間才會切換到這個新的版本。這就意味著庫要去向后兼容你想要支持的最老的 Java 版本 (許多情況下就是 Java 6 或者 7)。這實際上意味著未來的很長一段時間,你都不能在庫中運用 Java 9 所提供的新特性。幸運的是,多版本兼容 JAR 功能能讓你創建僅在特定版本的 Java 環境中運行庫程序時選擇使用的 class 版本:
在上述場景中, 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 上 所有組件的日志記錄。該日志記錄系統可以設置輸出的日志消息的標簽、級別、修飾符和輸出目標等。
java9的垃圾收集機制
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 中 。
除了上面這些以外,還有以下這么多的新特性,不再一一介紹。
102: Process API Updates
110: HTTP 2 Client
143: Improve Contended Locking
158: Unified JVM Logging
165: Compiler Control
193: Variable Handles
197: Segmented Code Cache
199: Smart Java Compilation, Phase Two
200: The Modular JDK
201: Modular Source Code
211: Elide Deprecation Warnings on Import Statements
212: Resolve Lint and Doclint Warnings
213: Milling Project Coin
214: Remove GC Combinations Deprecated in JDK 8
215: Tiered Attribution for javac
216: Process Import Statements Correctly
217: Annotations Pipeline 2.0
219: Datagram Transport Layer Security (DTLS)
220: Modular Run-Time Images
221: Simplified Doclet API
222: jshell: The Java Shell (Read-Eval-Print Loop)
223: New Version-String Scheme
224: HTML5 Javadoc
225: Javadoc Search
226: UTF-8 Property Files
227: Unicode 7.0
228: Add More Diagnostic Commands
229: Create PKCS12 Keystores by Default
231: Remove Launch-Time JRE Version Selection
232: Improve Secure Application Performance
233: Generate Run-Time Compiler Tests Automatically
235: Test Class-File Attributes Generated by javac
236: Parser API for Nashorn
237: Linux/AArch64 Port
238: Multi-Release JAR Files
240: Remove the JVM TI hprof Agent
241: Remove the jhat Tool
243: Java-Level JVM Compiler Interface
244: TLS Application-Layer Protocol Negotiation Extension
245: Validate JVM Command-Line Flag Arguments
246: Leverage CPU Instructions for GHASH and RSA
247: Compile for Older Platform Versions
248: Make G1 the Default Garbage Collector
249: OCSP Stapling for TLS
250: Store Interned Strings in CDS Archives
251: Multi-Resolution Images
252: Use CLDR Locale Data by Default
253: Prepare JavaFX UI Controls & CSS APIs for Modularization
254: Compact Strings
255: Merge Selected Xerces 2.11.0 Updates into JAXP
256: BeanInfo Annotations
257: Update JavaFX/Media to Newer Version of GStreamer
258: HarfBuzz Font-Layout Engine
259: Stack-Walking API
260: Encapsulate Most Internal APIs
261: Module System
262: TIFF Image I/O
263: HiDPI Graphics on Windows and Linux
264: Platform Logging API and Service
265: Marlin Graphics Renderer
266: More Concurrency Updates
267: Unicode 8.0
268: XML Catalogs
269: Convenience Factory Methods for Collections
270: Reserved Stack Areas for Critical Sections
喜歡本文的朋友們,歡迎長按下圖關注訂閱號程序員小灰,收看更多精彩內容
算法
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。