今天去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環境默認的通用的智能編譯工具。