modularity System 模塊系統(tǒng)
Java 9 中主要的變化是已經(jīng)實現(xiàn)的模塊化系統(tǒng)。
Modularity 提供了類似于 OSGI 框架的功能,模塊之間存在相互的依賴關(guān)系问麸,可以導(dǎo)出一個公共的 API关噪,并且隱藏實現(xiàn)的細節(jié)拿穴,Java 提供該功能的主要的動機在于,減少內(nèi)存的開銷全庸,在 JVM 啟動的時候秀仲,至少會有 30~60MB 的內(nèi)存加載,主要原因是 JVM 需要加載 rt.jar壶笼,不管其中的類是否被 classloader 加載神僵,第一步整個 jar 都會被 JVM 加載到內(nèi)存當中去,模塊化可以根據(jù)模塊的需要加載程序運行需要的 class覆劈。
在引入了模塊系統(tǒng)之后挑豌,JDK 被重新組織成 94 個模塊。Java 應(yīng)用可以通過新增的 jlink 工具墩崩,創(chuàng)建出只包含所依賴的 JDK 模塊的自定義運行時鏡像氓英。這樣可以極大的減少 Java 運行時環(huán)境的大小。使得 JDK 可以在更小的設(shè)備中使用鹦筹。采用模塊化系統(tǒng)的應(yīng)用程序只需要這些應(yīng)用程序所需的那部分 JDK 模塊铝阐,而非是整個 JDK 框架了。
HTTP/2
JDK9 之前提供 HttpURLConnection API 來實現(xiàn) HTTP 訪問功能铐拐,但是這個類基本很少使用徘键,一般都會選擇 Apache 的 HttpClient,此次在 Java 9 的版本中引入了一個新的 package:java.net.http遍蟋,里面提供了對 HTTP 訪問很好的支持吹害,不僅支持 HTTP 1.1 而且還支持 HTTP 2(什么是 HTTP2夺巩?請參見?HTTP2 的時代來了...)运悲,以及 WebSocket,據(jù)說性能特別好洛勉。
注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器模塊交付。也就是說纵穿,這套 API 不能保證 100% 完成下隧。
JShell
用過 Python 的童鞋都知道,Python 中的讀取-求值-打印循環(huán)( Read-Evaluation-Print Loop )很方便谓媒。它的目的在于以即時結(jié)果和反饋的形式淆院。
Java9 引入了 JShell 這個交互性工具,讓 Java 也可以像腳本語言一樣來運行句惯,可以從控制臺啟動 JShell 土辩,在 JShell 中直接輸入表達式并查看其執(zhí)行結(jié)果。當需要測試一個方法的運行效果抢野,或是快速的對表達式進行求值時拷淘,JShell 都非常實用。
除了表達式之外蒙保,還可以創(chuàng)建 Java 類和方法辕棚。jshell 也有基本的代碼完成功能。我們在教人們?nèi)绾尉帉?Java 的過程中邓厕,不再需要解釋 “public static void main(String [] args)” 這句廢話逝嚎。
不可變集合工廠方法
Java 9 增加了 List.of()、Set.of()详恼、Map.of()和 Map.ofEntries()等工廠方法來創(chuàng)建不可變集合补君。
List strs = List.of("Hello","World");
List strs List.of(1,2,3);
Set strs =Set.of("Hello","World");
Set ints =Set.of(1,2,3);
Map maps =Map.of("Hello",1,"World",2);
除了更短和更好閱讀之外,這些方法也可以避免您選擇特定的集合實現(xiàn)昧互。在創(chuàng)建后挽铁,繼續(xù)添加元素到這些集合會導(dǎo)致 “UnsupportedOperationException”。
私有接口方法
Java 8 為我們提供了接口的默認方法和靜態(tài)方法敞掘,接口也可以包含行為叽掘,而不僅僅是方法定義。
默認方法和靜態(tài)方法可以共享接口中的私有方法玖雁,因此避免了代碼冗余更扁,這也使代碼更加清晰。如果私有方法是靜態(tài)的赫冬,那這個方法就屬于這個接口的浓镜。并且沒有靜態(tài)的私有方法只能被在接口中的實例調(diào)用。
interfaceInterfaceWithPrivateMethods{
privatestaticStringstaticPrivate(){
return"static private";
}
privateStringinstancePrivate(){
return"instance private";
}
defaultvoidcheck(){
String result = staticPrivate();
InterfaceWithPrivateMethods pvt =newInterfaceWithPrivateMethods() {
// anonymous class 匿名類
};
result = pvt.instancePrivate();
}
}
HTML5 風格的 Java 幫助文檔
Java 8 之前的版本生成的 Java 幫助文檔是在 HTML 4 中劲厌。在 Java 9 中膛薛,Javadoc 的輸出現(xiàn)在符合兼容 HTML5 標準。現(xiàn)在 HTML 4 是默認的輸出標記語言补鼻,但是在之后發(fā)布的 JDK 中哄啄,HTML 5 將會是默認的輸出標記語言雅任。
Java 幫助文檔還是由三個框架組成的結(jié)構(gòu)構(gòu)成,這是不會變的增淹,并且以 HTML 5 輸出的 Java 幫助文檔也保持相同的結(jié)構(gòu)椿访。每個 Javadoc 頁面都包含有關(guān) JDK 模塊類或接口來源的信息乌企。
多版本兼容 JAR
當一個新版本的 Java 出現(xiàn)的時候虑润,你的庫用戶要花費很長時間才會切換到這個新的版本。這就意味著庫要去向后兼容你想要支持的最老的 Java 版本 (許多情況下就是 Java 6 或者 7)加酵。這實際上意味著未來的很長一段時間拳喻,你都不能在庫中運用 Java 9 所提供的新特性。幸運的是猪腕,多版本兼容 JAR 功能能讓你創(chuàng)建僅在特定版本的 Java 環(huán)境中運行庫程序時選擇使用的 class 版本:
multirelease.jar
├──META-INF
│ ? └──versions
│ ? ? ? └── 9
│ ? ? ? ? ? └──multirelease
│ ? ? ? ? ? ? ? └──Helper.class
├──multirelease
├──Helper.class
└──Main.class
在上述場景中冗澈,multirelease.jar 可以在 Java 9 中使用, 不過 Helper 這個類使用的不是頂層的 multirelease.Helper 這個 class, 而是處在“META-INF/versions/9”下面的這個。這是特別為 Java 9 準備的 class 版本陋葡,可以運用 Java 9 所提供的特性和庫亚亲。同時,在早期的 Java 諸版本中使用這個 JAR 也是能運行的腐缤,因為較老版本的 Java 只會看到頂層的這個 Helper 類捌归。
統(tǒng)一 JVM 日志
Java 9 中 ,JVM 有了統(tǒng)一的日志記錄系統(tǒng)岭粤,可以使用新的命令行選項-Xlog 來控制 JVM 上 所有組件的日志記錄惜索。該日志記錄系統(tǒng)可以設(shè)置輸出的日志消息的標簽、級別剃浇、修飾符和輸出目標等巾兆。
Java 9 的垃圾收集機制
Java 9 移除了在 Java 8 中 被廢棄的垃圾回收器配置組合,同時把 G1 設(shè)為默認的垃圾回收器實現(xiàn)虎囚。替代了之前默認使用的 Parallel GC角塑,對于這個改變,evens 的評論是醬紫的:這項變更是很重要的淘讥,因為相對于 Parallel 來說圃伶,G1 會在應(yīng)用線程上做更多的事情,而 Parallel 幾乎沒有在應(yīng)用線程上做任何事情适揉,它基本上完全依賴 GC 線程完成所有的內(nèi)存管理留攒。這意味著切換到 G1 將會為應(yīng)用線程帶來額外的工作,從而直接影響到應(yīng)用的性能嫉嘀。
I/O 流新特性
java.io.InputStream 中增加了新的方法來讀取和復(fù)制 InputStream 中包含的數(shù)據(jù)炼邀。
readAllBytes:讀取 InputStream 中的所有剩余字節(jié);
readNBytes: 從 InputStream 中讀取指定數(shù)量的字節(jié)到數(shù)組中剪侮;
transferTo:讀取 InputStream 中的全部字節(jié)并寫入到指定的 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
271: Unified GC Logging
272: Platform-Specific Desktop Features
273: DRBG-Based SecureRandom Implementations
274: Enhanced Method Handles
275: Modular Java Application Packaging
276: Dynamic Linking of Language-Defined Object Models
277: Enhanced Deprecation
278: Additional Tests for Humongous Objects in G1
279: Improve Test-Failure Troubleshooting
280: Indify String Concatenation
281: HotSpot C++ Unit-Test Framework
282: jlink: The Java Linker
283: Enable GTK 3 on Linux
284: New HotSpot Build System
285: Spin-Wait Hints
287: SHA-3 Hash Algorithms
288: Disable SHA-1 Certificates
289: Deprecate the Applet API
290: Filter Incoming Serialization Data
292: Implement Selected ECMAScript 6 Features in Nashorn
294: Linux/s390x Port
295: Ahead-of-Time Compilation
相信有很多學習java的道友兵怯,在這里我給大家說說我的群哦,分享一套系統(tǒng)的java教程哦腔剂,872603705媒区,絕對的 java干貨,首先你是學習java的掸犬,不管是大神還是小白袜漩,我們一同從入門到精通吧!