二、模塊化系統----Jigsaw項目java
①能夠在更小的設備中運行;算法
②必須的jdk模塊,非所有jdk模塊;app
③甚至開發者還能夠建立本身的模塊來簡化代碼;模塊化
④內部的API(com.sun.*),默認狀況下是不能使用,即:全部的模塊須要在所謂的module-info.java文件中進行描述,這個文件是位於java代碼結構的頂層(相似於import)工具
總結一句就是:獨立模塊,化繁爲簡。性能
三、集合的of新特性優化
①Map中存值變得更簡單spa
在集合中統一增長了一個of方法,List/Set/Map均可以調用of方法直接存入key,value命令行
1 //JDK8 2 Map <String,String> immutableMap = Collections.unmodifiableMap(new HashMap<String,String>(){{ 3 put("張鬆","課程1"); 4 put("王述","課程2"); 5 put("陳曉","課程3"); 6 }}) 7 8 //JDK9 9 Map <String,String> immutableMap = 10 Map.of("張鬆","課程1","王述","課程2","陳曉","課程3");
四、JShell--Java 9 REPL:是一種快速運行語句的命令行工具調試
在Java 9 中JShell能夠在沒有建立類的狀況下直接聲明變量,計算表達式,執行語句。JShell也能夠從文件中加載語句或將語句保存到文件中。而且JShell也能夠是Tab鍵進行自動補全的特性。這就區別於main方法類,Test類。
總結就是:執行JShell則能夠所見即所得,即時結果和反饋。
五、Reactive Streams(響應式流)
Java 9 中有一個Flow API ,主要有如下幾個重要的類:
① Flow.Processor(處理器)
② Flow.Publisher (發佈者)
③ Flow.Subscriber(訂閱者)
④ Flow.Subscription(訂閱管理器)
Java 9 中也提供了實用類------SubmissionPublisher,一個發佈者產生一個或者多個物品,這些物品由一個或者多個消費者來消耗,而且訂閱者由訂閱管理器管理,訂閱管理器鏈接訂閱者和發佈者。
六、Interfaces(接口差別)
在JDK8中提出在接口中引入默認方法和靜態方法,而在JDK9中實現了在接口中引入默認方法和靜態方法。
具體包含:能夠共享接口中的私有方法,去除冗餘,邏輯更加清晰。若是私有方法是靜態的,那麼這個方法就屬於這個接口的,且沒有靜態的私有方法只能被在接口中的實例調用。
七、API-JEP 251(多分辨率圖像)
Java 9 新的API定義在java.awt.image包。
具體包括:
①將不一樣分辨率的圖像封裝到一張(多分辨率的)圖像中,做爲它的變體。
②獲取這個圖像的全部變體。
③獲取特定分辨率的圖像變體,表示一張已知分辨率單位爲DPI的特定尺寸大小的邏輯圖像,而且這張圖像是最佳的變體。
④基於當前屏幕分辨率大小和運用圖像轉換算法,java.awt.Graphics類能夠直接從接口MultiResolutionImage獲取所需的變體。java.awt.image.AbstarctMultiResolutionImage類提供了ava.awt.image.AbstarctMultiResolutionImage的默認實現。AbstarctMultiResolutionImage的基礎實現是java.awt.image.BaseMultiResolutionImage。
八、進程改善和鎖機制的優化
Process API Improvements(進程API的改善):改善鎖爭用機制,程序的性能將大大地改善。
如:Process.getCurrentPid()方法能夠代替不少原來JDK版本的代碼。
九、Try-with-Resource
JDK7中try-with-resource語法要求爲每個資源聲明一個新的變量,而這些語句由try-with-resource語句進行管理。
JDK9中若是一個資源被final或等效於final變量引用,則在不須要一個新的變量的狀況下,try-with-resource就能夠對這個資源進行管理。
MyAutoCloseable arrayClass = new MyAutoCloseable(); try (arrayClass){ //業務代碼省略 } try(new MyAutoCloseable(){ }.finalWrapper.finalCloseable){ //業務代碼省略 }
十、Diamond Operator Scope Extension操做符範圍的延伸
//JDK5--JDK7 List<String> preJava7 = new ArrayList<String>(); //JDK7以後 List<String> java7 = new ArrayList<>(); //只有JDK9以下代碼才能編譯經過(匿名類上能夠) List<String> list = new ArrayList<>(){};
十一、Deprecated annotation Enhanced
喚醒已廢棄的API ---- 在JDK9中:註解@Deprecated能夠標記Java API,使用了哪些已廢棄的API。
十二、Unified JVM Logging(統一的JVM日誌系統)
在JDK9中統一了日誌,提供了一種解決問題的有效途徑。
在以往的低版本中很難知道致使JVM性能問題和致使JVM崩潰的根本緣由。不一樣的JVM對日誌的使用是不一樣的機制和規則,這就使得JVM難以進行調試。
解決這個問題最佳的方法:對全部的JVM組件引入一個單一的系統,這些JVM組件支持細粒度的和易配置的JVM組件。
1三、SafeVarargs Scope Extension(註釋SafeVarargs範圍的延伸)
1 //JDK9:@Safevarargs可使用 2 @SafeVarargs 3 private void iAmArrayDemoMethod(String... arrayDemos){ 4 for(String i : arrayDemos){ 5 System.out.println("這個是此標籤的用法:"+ i); 6 } 7 } 8
1四、HTTP 2 客戶端
JDK9使用了全新的HTTP客戶端API,支持HTTP/2協議和WebSocket協議,而且替換了遺留的HTTPURL Connection API,這些API能夠從Incubator(孵化器)模塊中獲取。所以在默認狀況下,這個模塊是不能根據classpath獲取的,須要使用--add--modules命令選項配置這個模塊,將這個模塊添加到classpath中。
除了這個簡答的請求/響應模型外,HttpClient還提供了新的API來處理HTTP/2的特性,好比流和服務端推送。
1五、HTML5 Javadoc
在JDK8中生成的Java幫助文檔是在HTML4中,而HTML4已是好久的標準了。而在JDK9中提供了一種選擇,讓Javadoc的輸出兼容符合標準的HTML5格式,並向下兼容HTML4。
1六、多版本兼容JAR
JDK9中提供了在建立特定版本的Java環境中運行庫程序時選擇使用的class版本;好比:
1七、Segmented Code Cache
在JDK9中的代碼段在Segmented Code Cache的做用下,能夠被更加細分,並且每一個代碼段還能夠包括特定類型的編譯代碼,這個功能一樣也有望提高Java 9的性能。
1八、錢和貨幣的相關API
JDK9中引入了新的貨比API,用來表示貨幣,並支持幣種之間的轉換和各類複雜運算。
1 //Maven項目 2 <dependency> 3 <groupId>org.javamoney</groupId> 4 <artifactId>moneta</artifactId> 5 <version>0.9</version> 6 </dependency> 7 8 //根據貨幣代碼來獲取貨幣單位 9 CurrencyUnit arrayo = MonetaryCurrencies.getCurrency("EUR"); 10 CurrencyUnit arrayusDollar=MonetaryCurrencies.getCurrency("USD"); 11 12 //根據國家和地區來獲取貨幣單位 13 CurrencyUnit arrayyen = MonetaryCurrencies.getCurrency("Locale.JAPAN"); 14 CurrencyUnit arraycanadianDollar = MonetaryCurrencies.getCurrency("Locale.CANADA");
1九、智能Java編譯工具
JDK9中的智能Java編譯工具(s javac)的第一階段始於JEP139這個項目,用於在多核處理器狀況下提高JDK的編譯速度。現在,這個項目已經進入第二階段即JEP199,其目的是改進Java編譯工具,並取代目前JDK編譯工具javac,繼而成爲Java環境默認的通用的智能編譯工具。