JDK9的新特性


    今天去thoughtwork面試,面試官問到了你對Java1.9的新特性的了解,在這里做一個詳細的說明:

 1、關於java1.9的官網下載

    

    首先是登錄Oracle網址,在菜單頁面選項中可以下載到最新的Java SE 1.9的版本。

 2、模塊化系統----Jigsaw項目

    ①可以在更小的設備中運行;

    ②必須的jdk模塊,非全部jdk模塊;

    ③甚至開發者還可以創建自己的模塊來簡化代碼;

    ④內部的API(com.sun.*),默認情況下是不能使用,即:所有的模塊需要在所謂的module-info.java文件中進行描述,這個文件是位於java代碼結構的頂層(類似於import)

    總結一句就是:獨立模塊,化繁為簡。

  3、集合的of新特性

    ①Map中存值變得更簡單

     在集合中統一增加了一個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");     

 4、JShell--Java 9 REPL:是一種快速運行語句的命令行工具

   在Java 9 中JShell可以在沒有創建類的情況下直接聲明變量,計算表達式,執行語句。JShell也可以從文件中加載語句或將語句保存到文件中。並且JShell也可以是Tab鍵進行自動補全的特性。這就區別於main方法類,Test類。

   總結就是:執行JShell則可以所見即所得,即時結果和反饋。

 5、Reactive  Streams(響應式流)

   Java 9 中有一個Flow API ,主要有以下幾個重要的類:

  ① Flow.Processor(處理器)

  ② Flow.Publisher (發布者)

  ③ Flow.Subscriber(訂閱者)

  ④ Flow.Subscription(訂閱管理器)

  Java 9 中也提供了實用類------SubmissionPublisher,一個發布者產生一個或者多個物品,這些物品由一個或者多個消費者來消耗,並且訂閱者由訂閱管理器管理,訂閱管理器連接訂閱者和發布者。

 6、Interfaces(接口差異)

  在JDK8中提出在接口中引入默認方法和靜態方法,而在JDK9中實現了在接口中引入默認方法和靜態方法。

  具體包含:可以共享接口中的私有方法,去除冗余,邏輯更加清晰。如果私有方法是靜態的,那么這個方法就屬於這個接口的,且沒有靜態的私有方法只能被在接口中的實例調用。

 7、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。

  8、進程改善和鎖機制的優化

    Process API Improvements(進程API的改善):改善鎖爭用機制,程序的性能將大大地改善。

    如:Process.getCurrentPid()方法可以代替很多原來JDK版本的代碼。

  9、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){
             //業務代碼省略
}        

  10、Diamond  Operator  Scope  Extension操作符范圍的延伸

//JDK5--JDK7
List<String>  preJava7 = new ArrayList<String>();

//JDK7之后
List<String> java7 = new ArrayList<>();

//只有JDK9如下代碼才能編譯通過(匿名類上可以)
List<String> list = new ArrayList<>(){};

    11、Deprecated annotation Enhanced

  喚醒已廢棄的API ---- 在JDK9中:注解@Deprecated可以標記Java API,使用了哪些已廢棄的API。

  12、Unified JVM Logging(統一的JVM日志系統)

  在JDK9中統一了日志,提供了一種解決問題的有效途徑。

  在以往的低版本中很難知道導致JVM性能問題和導致JVM崩潰的根本原因。不同的JVM對日志的使用是不同的機制和規則,這就使得JVM難以進行調試。

  解決這個問題最佳的方法:對所有的JVM組件引入一個單一的系統,這些JVM組件支持細粒度的和易配置的JVM組件。

  13、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     

  14、HTTP 2 客戶端

  JDK9使用了全新的HTTP客戶端API,支持HTTP/2協議和WebSocket協議,並且替換了遺留的HTTPURL Connection API,這些API可以從Incubator(孵化器)模塊中獲取。因此在默認情況下,這個模塊是不能根據classpath獲取的,需要使用--add--modules命令選項配置這個模塊,將這個模塊添加到classpath中。

  除了這個簡答的請求/響應模型外,HttpClient還提供了新的API來處理HTTP/2的特性,比如流和服務端推送。

  15、HTML5 Javadoc

  在JDK8中生成的Java幫助文檔是在HTML4中,而HTML4已經是很久的標准了。而在JDK9中提供了一種選擇,讓Javadoc的輸出兼容符合標准的HTML5格式,並向下兼容HTML4。

  16、多版本兼容JAR

  JDK9中提供了在創建特定版本的Java環境中運行庫程序時選擇使用的class版本;比如:

 

  17、Segmented Code Cache

  在JDK9中的代碼段在Segmented Code Cache的作用下,可以被更加細分,而且每個代碼段還可以包括特定類型的編譯代碼,這個功能同樣也有望提升Java 9的性能。

  18、錢和貨幣的相關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");

  19、智能Java編譯工具

  JDK9中的智能Java編譯工具(s javac)的第一階段始於JEP139這個項目,用於在多核處理器情況下提升JDK的編譯速度。如今,這個項目已經進入第二階段即JEP199,其目的是改進Java編譯工具,並取代目前JDK編譯工具javac,繼而成為Java環境默認的通用的智能編譯工具。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM