天天看點

jdk5-jdk10各個版本的新特性

JDK1.5新特性: 1.自動裝箱與拆箱: 2.枚舉 3.靜态導入,如:import staticjava.lang.System.out 4.可變參數(Varargs) 5.内省(Introspector),主要用于操作JavaBean中的屬性,通過getXxx/setXxx。一般的做法是通過類Introspector來擷取某個對象的BeanInfo資訊,然後通過BeanInfo來擷取屬性的描述器(PropertyDescriptor),通過這個屬性描述器就可以擷取某個屬性對應的getter/setter方法,然後我們就可以通過反射機制來調用這些方法。 6.泛型(Generic)(包括通配類型/邊界類型等) 7.For-Each循環 8.注解 9.協變傳回類型:實際傳回類型可以是要求的傳回類型的一個子類型 JDK1.6新特性: 1. AWT新增加了兩個類:Desktop和SystemTray,其中前者用來通過系統預設程式來執行一個操作,如使用預設浏覽器浏覽指定的URL,用預設郵件用戶端給指定的郵箱發郵件,用預設應用程式打開或編輯檔案(比如,用記事本打開以txt為字尾名的檔案),用系統預設的列印機列印文檔等。後者可以用來在系統托盤區建立一個托盤程式 2.使用JAXB2來實作對象與XML之間的映射,可以将一個Java對象轉變成為XML格式,反之亦然 3. StAX,一種利用拉模式解析(pull-parsing)XML文檔的API。類似于SAX,也基于事件驅動模型。之是以将StAX加入到JAXP家族,是因為JDK6中的JAXB2和JAX-WS 2.0中都會用StAX。 4.使用Compiler API,動态編譯Java源檔案,如JSP編譯引擎就是動态的,是以修改後無需重新開機伺服器。 5.輕量級Http Server API,據此可以建構自己的嵌入式HttpServer,它支援Http和Https協定。 6.插入式注解處理API(PluggableAnnotation Processing API) 7.提供了Console類用以開發控制台程式,位于java.io包中。據此可友善與Windows下的cmd或Linux下的Terminal等互動。 8.對腳本語言的支援如: ruby,groovy, javascript 9.Common Annotations,原是J2EE 5.0規範的一部分,現在把它的一部分放到了J2SE 6.0中 10.嵌入式資料庫 Derby JDK1.7 新特性 1.對Java集合(Collections)的增強支援,可直接采用[]、{}的形式存入對象,采用[]的形式按照索引、鍵值來擷取集合中的對象。如: List<String>list=[“item1”,”item2”];//存 Stringitem=list[0];//直接取          Set<String>set={“item1”,”item2”,”item3”};//存          Map<String,Integer> map={“key1”:1,”key2”:2};//存          Intvalue=map[“key1”];//取 2.在Switch中可用String 3.數值可加下劃線用作分隔符(編譯時自動被忽略) 4.支援二進制數字,如:int binary= 0b1001_1001; 5.簡化了可變參數方法的調用 6.調用泛型類的構造方法時,可以省去泛型參數,編譯器會自動判斷。 7.Boolean類型反轉,空指針安全,參與位運算 8.char類型的equals方法: booleanCharacter.equalsIgnoreCase(char ch1, char ch2) 9.安全的加減乘除: Math.safeToInt(longv); Math.safeNegate(int v); Math.safeSubtract(long v1, int v2);Math.safeMultiply(int v1, int v2)…… 10 .Map集合支援并發請求,注HashTable是線程安全的,Map是非線程安全的。但此處更新使得其也支援并發。另外,Map對象可這樣定義:Map map = {name:"xxx",age:18}; JDK1.8新特性 1.接口的預設方法:即接口中可以聲明一個非抽象的方法做為預設的實作,但隻能聲明一個,且在方法的傳回類型前要加上“default”關鍵字。 2. Lambda 表達式:是對匿名比較器的簡化,如:          Collections.sort(names,(String a, String b) -> { returnb.compareTo(a); }); 對于函數體隻有一行代碼的,你可以去掉大括号{}以及return關鍵字。如:          Collections.sort(names,(String a, String b) -> b.compareTo(a )); 或:Collections.sort(names, (a, b) -> b.compareTo(a )); 3. 函數式接口:是指僅僅隻包含一個抽象方法的接口,要加@FunctionalInterface注解 4. 使用 :: 關鍵字來傳遞方法或者構造函數引用 5.多重注解 6.還增加了很多與函數式接口類似的接口以及與Map相關的API等…… jdk1.9新特性 1、 Java 平台級子產品系統 當啟動一個子產品化應用時, JVM 會驗證是否所有的子產品都能使用,這基于 `requires` 語句——比脆弱的類路徑邁進了一大步。子產品允許你更好地強制結構化封裝你的應用并明确依賴。

2. Linking

 當你使用具有顯式依賴關系的子產品和子產品化的 JDK 時,新的可能性出現了。你的應用程式子產品現在将聲明其對其他應用程式子產品的依賴以及對其所使用的 JDK 子產品的依賴。為什麼不使用這些資訊建立一個最小的運作時環境,其中隻包含運作應用程式所需的那些子產品呢? 這可以通過 Java 9 中的新的 jlink 工具實作。你可以建立針對應用程式進行優化的最小運作時映像而不需要使用完全加載 JDK 安裝版本。

3. JShell : 互動式 Java REPL

許多語言已經具有互動式程式設計環境,Java 現在加入了這個俱樂部。您可以從控制台啟動 jshell ,并直接啟動輸入和執行 Java 代碼。 jshell 的即時回報使它成為探索 API 和嘗試語言特性的好工具。

4. 改進的 Javadoc

Javadoc 現在支援在 API 文檔中的進行搜尋。另外,Javadoc 的輸出現在符合相容 HTML5 标準。此外,你會注意到,每個 Javadoc 頁面都包含有關 JDK 子產品類或接口來源的資訊。

jdk5-jdk10各個版本的新特性

5. 集合工廠方法

通常,您希望在代碼中建立一個集合(例如,List 或 Set ),并直接用一些元素填充它。 執行個體化集合,幾個 “add” 調用,使得代碼重複。 Java 9,添加了幾種集合工廠方法:

1 2 Set<Integer> ints = Set.of( 1 , 2 , 3 ); List<String> strings = List.of( "first" , "second" );

除了更短和更好閱讀之外,這些方法也可以避免您選擇特定的集合實作。 事實上,從工廠方法傳回已放入數個元素的集合實作是高度優化的。這是可能的,因為它們是不可變的:在建立後,繼續添加元素到這些集合會導緻 “UnsupportedOperationException” 。

6. 改進的 Stream API

長期以來,Stream API 都是 Java 标準庫最好的改進之一。通過這套 API 可以在集合上建立用于轉換的申明管道。在 Java 9 中它會變得更好。Stream 接口中添加了 4 個新的方法:dropWhile, takeWhile, ofNullable。還有個 iterate 方法的新重載方法,可以讓你提供一個 Predicate (判斷條件)來指定什麼時候結束疊代:

1 IntStream.iterate( 1 , i -> i < 100 , i -> i + 1 ).forEach(System.out::println);

第二個參數是一個 Lambda,它會在目前 IntStream 中的元素到達 100 的時候傳回 true。是以這個簡單的示例是向控制台列印 1 到 99。 除了對 Stream 本身的擴充,Optional 和 Stream 之間的結合也得到了改進。現在可以通過 Optional 的新方法 `stram` 将一個 Optional 對象轉換為一個(可能是空的) Stream 對象:

1 Stream<Integer> s = Optional.of( 1 ).stream();

在組合複雜的 Stream 管道時,将 Optional 轉換為 Stream 非常有用。

7. 私有接口方法

使用 Java 9,您可以向接口添加私有輔助方法來解決此問題:

1 2 3 4 5 6 7 8 9 10 11 public interface MyInterface {        void normalInterfaceMethod();        default void interfaceMethodWithDefault() {  init(); }        default void anotherDefaultMethod() { init(); }        // This method is not part of the public API exposed by MyInterface      private void init() { System.out.println( "Initializing" ); } }

如果您使用預設方法開發 API ,那麼私有接口方法可能有助于建構其實作。

8. HTTP/2

Java 9 中有新的方式來處理 HTTP 調用。這個遲到的特性用于代替老舊的 `HttpURLConnection` API,并提供對 WebSocket 和 HTTP/2 的支援。注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器子產品傳遞。也就是說,這套 API 不能保證 100% 完成。不過你可以在 Java 9 中開始使用這套 API:

1 2 3 4 5 6 7 8 9 10 HttpClient client = HttpClient.newHttpClient();   HttpRequest req =     HttpRequest.newBuilder(URI.create( " http://www.google.com " ))                .header( "User-Agent" , "Java" )                .GET()                .build();     HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());

HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString()); 除了這個簡單的請求/響應模型之外,HttpClient 還提供了新的 API 來處理 HTTP/2 的特性,比如流和服務端推送。

9. 多版本相容 JAR

我們最後要來着重介紹的這個特性對于庫的維護者而言是個特别好的消息。當一個新版本的 Java 出現的時候,你的庫使用者要花費數年時間才會切換到這個新的版本。這就意味着庫得去向後相容你想要支援的最老的 Java 版本 (許多情況下就是 Java 6 或者 7)。這實際上意味着未來的很長一段時間,你都不能在庫中運用 Java 9 所提供的新特性。幸運的是,多版本相容 JAR 功能能讓你建立僅在特定版本的 Java 環境中運作庫程式時選擇使用的 class 版本:

1 2 3 4 5 6 7 8 9 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 類。 JDK 10 何時釋出? JDK 10 是 Java 10 标準版的部分實作,将于 2018 年 3 月 20 日釋出,改進的關鍵點包括一個本地類型推斷、一個垃圾回收的“幹淨”接口。 Oracle 已經為 Java 設定了六個月的發行計劃。之前本打算根據發行的年份和月份命名更新版和後續版,這樣的話第一個版本就會被稱為 Java 18.3, 但這個計劃後來被中止了。 如何下載下傳 JDK 10? 使用者要先加入早期使用者計劃,然後才可以下載下傳 JDK 10 測試版: http://jdk.java.net/10 。 JDK 10 的新改進有哪些? JDK 10 的主要功能包括:

  • 一個局部變量類型推斷,通過增強語言特性将類型推斷擴充到局部變量,目的是減少與編碼相關的“儀式”,同時保持對靜态類型的安全承諾。
  • 一個幹淨的垃圾收集器接口,用來改善垃圾收集器源代碼之間的隔離效果,這樣可以為HotSpot 虛拟機中的内部垃圾收集代碼提供更好的子產品化功能,也可以更容易向 HotSpot 添加新的垃圾收集器。
  • 并行、完整的 G1 垃圾收集器,通過實作并行性來改善最壞情況下的延遲問題。
  • 啟用 HotSpot 将對象堆配置設定給使用者指定的備用記憶體裝置(如 NVDIMM 記憶體子產品),這個特性也側面預示了未來的系統可能會采用異構的記憶體架構。
  • 在 Linux / x64 平台上以實驗性方式啟用基于 Java 的即時編譯器(https://www.infoworld.com/article/3187868/application-development/oracles-java-on-java-experiment-picks-up-steam.html)。
  • 将 JDK 的多個存儲庫合并成一個,簡化開發。目前的代碼庫被分解成了多個庫,容易出現源代碼的管理問題。
  • 應用程式資料共享,通過跨程序共享通用類的中繼資料,減少空間占用及啟動時長。
  • 線程本地握手,不執行全局 VM 安全點也能對線程執行回調,同時實作單線程停止回調。
  • JDK 提供了一組預設證書,開源 Java SE 的 CA程式,對開發人員更具吸引力。

JDK 10 的開發包括哪些階段? 目前,Oracle 的 Java SE 下載下傳頁面( http://www.oracle.com/technetwork/java/javase/downloads/index.html )還沒有提供對 JDK 10 的通路,因為在最終版本确認之前,JDK 10 還有一些其他的開發階段,包括:

  • 2018 年 1 月 11 日:在所有支援的平台上,對所有計劃完成至少一次的測試。
  • 2018 年 1 月 18 日:減速階段,隻修複“ showstopper ”的 Bug。
  • 2018 年 2 月 22 日:最終版本确認。

從 9 月 21 日期待已久的 JDK 9 版本釋出開始,Oracle 就一直在計劃 Java 的改進和更新,包括将于 2018 年 3 月到期的 Java 18.3 版本,這個版本将作為 Java 标準版的釋出計劃一部分。 Java 的長期路線圖 以下是 Oracle 公司正在考慮的下一代産品、以及更高版本的 Java SE:

  • Amber 項目(https://www.infoworld.com/article/3187868/application-development/oracles-java-on-java-experiment-picks-up-steam.html)是面向生産力的語言特征孵化器,包括局部變量類型推斷在内的各種較小的語言,目标是減少編寫 Java 代碼的相關程式、通過增強枚舉使類型變量的常量執行更為清晰、提高 Lambda 方法的可用性。
  • Panama 項目(https://www.infoworld.com/article/2607953/java/article.html),将 JVM 和本地代碼互連,具有來自 JVM 的本地函數調用和來自 JVM 的本地資料通路等功能。
  • Valhalla 項目(https://www.infoworld.com/article/2608087/java/java-incubator-to-explore-technologies-for-java-10-and-beyond.html)是進階 Java 虛拟機和語言特性孵化器。
  • Loom 項目(http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html),以降低編寫并發應用程式的複雜性為目标,項目要求添加可選的使用者模式線程實作、定界延續以及涉及調用堆棧操作的其他構造。通過提供一個由 Java 編寫的排程器,替代實作線程的管理,這樣子普通 Java 線程的 Java 程式設計模型就可以被保留下來,提高了性能,減少了占用空間。

新的六月發行計劃推出後,也就意味着不同版本的功能更新會間隔六個月。但是目前除了已經宣布的 JDK 10 之外,Oracle 還沒有承諾在 Java 中提供其他新的功能。