Java 9 新特性
更新時間:2018.12.17
目錄
- 1. 模塊系統(tǒng)[Jigsaw 項目](Modularity System)
- 2. HTTP/2
- 3. JShell
- 4. 不可變集合工廠方法
- 5. 私有接口方法
- 6. HTML5風(fēng)格的Java幫助文檔
- 7. 多版本兼容 JAR
- 8. java9的垃圾收集機制
- 9. I/O 流新特性
參考文檔
多數(shù)內(nèi)容摘錄于JDK 9新特性匯總绪颖,感謝所有的知識分享者屑咳。
- OpenJDK-JDK9 更新內(nèi)容
- Java9模塊化遇坑
- The State of the Module System
- Java 9 逆天的十大新特性
- JDK 9新特性匯總
- Java9新特性之——JShell
1. 模塊系統(tǒng)[Jigsaw 項目](Modularity System)
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)存當(dāng)中去圣勒,模塊化可以根據(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框架了锡搜。
2. HTTP/2
JDK9之前提供HttpURLConnection API來實現(xiàn)Http訪問功能橙困,但是這個類基本很少使用,一般都會選擇Apache的Http Client耕餐,此次在Java 9的版本中引入了一個新的package:java.net.http凡傅,里面提供了對Http訪問很好的支持,不僅支持Http1.1而且還支持HTTP2(什么是HTTP2肠缔?請參見HTTP2的時代來了...)夏跷,以及WebSocket,據(jù)說性能特別好明未。
注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器模塊交付槽华。也就是說,這套 API 不能保證 100% 完成趟妥。
3. JShell
JShell的目標(biāo)是提供一個交互工具猫态,通過它來運行和計算java中的表達式。開發(fā)者可以輕松地與JShell交互披摄,其中包括:編輯歷史亲雪,tab鍵代碼補全,自動添加分號疚膊,可配置的imports和definitions义辕。其他的很多主流編程語言如python都已經(jīng)提供了console,便于編寫一些簡單的代碼用于測試酿联。值得一提的是终息,JShell并不是提供了新的一個交互語言,在JShell中編寫的所有代碼都必須符合java語言規(guī)范贞让;圖形界面和調(diào)試支持也沒有周崭,JShell的一個目標(biāo)是可以在IDE中使用JShell交互,而不是實現(xiàn)IDE實現(xiàn)的功能喳张。
4. 不可變集合工廠方法
Java 9增加了List.of()续镇、Set.of()、Map.of()和Map.ofEntries()等工廠方法來創(chuàng)建不可變集合销部。
除了更短和更好閱讀之外摸航,這些方法也可以避免您選擇特定的集合實現(xiàn)。在創(chuàng)建后舅桩,繼續(xù)添加元素到這些集合會導(dǎo)致 “UnsupportedOperationException” 酱虎。
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);
5. 私有接口方法
Java 8 為我們提供了接口的默認方法和靜態(tài)方法,接口也可以包含行為擂涛,而不僅僅是方法定義读串。
默認方法和靜態(tài)方法可以共享接口中的私有方法,因此避免了代碼冗余,這也使代碼更加清晰恢暖。如果私有方法是靜態(tài)的排监,那這個方法就屬于這個接口的。并且沒有靜態(tài)的私有方法只能被在接口中的實例調(diào)用杰捂。
interface InterfaceWithPrivateMethods {
private static String staticPrivate() {
return "static private";
}
private String instancePrivate() {
return "instance private";
}
default void check() {
String result = staticPrivate();
InterfaceWithPrivateMethods pvt = new InterfaceWithPrivateMethods() {
// anonymous class 匿名類
};
result = pvt.instancePrivate();
}
}
6. HTML5風(fēng)格的Java幫助文檔
7. 多版本兼容 JAR
當(dāng)一個新版本的 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 準(zhǔn)備的 class 版本熄浓,可以運用 Java 9 所提供的特性和庫。同時省撑,在早期的 Java 諸版本中使用這個 JAR 也是能運行的赌蔑,因為較老版本的 Java 只會看到頂層的這個 Helper 類。
8. java9的垃圾收集機制
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)用的性能
9. I/O 流新特性
java.io.InputStream 中增加了新的方法來讀取和復(fù)制 InputStream 中包含的數(shù)據(jù)证膨。
readAllBytes:讀取 InputStream 中的所有剩余字節(jié)。
readNBytes: 從 InputStream 中讀取指定數(shù)量的字節(jié)到數(shù)組中鼓黔。
transferTo:讀取 InputStream 中的全部字節(jié)并寫入到指定的 OutputStream 中 央勒。