1. 程式人生 > >JDK各個版本比較 JDK5~JDK10

JDK各個版本比較 JDK5~JDK10

某天早上,看新聞頭條,一條訊息引起了我的注意,JDK10問世!我的天哪,公司開發好像還在用JDK6,難道落伍那麼多了嗎!!為了弄清楚各個版本之間的關係,特地羅列了一下。  JDK5

  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. 協變返回型別:實際返回型別可以是要求的返回型別的一個子型別  JDK6

    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(這個也是剛知道,基本沒用過)

JDK7

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”];//取
  • 1
  • 2
  • 3
  • 4
  • 5

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};

JDK8

1.介面的預設方法:即介面中可以宣告一個非抽象的方法做為預設的實現,但只能宣告一個,且在方法的返回型別前要加上“default”關鍵字。  2.Lambda 表示式:是對匿名比較器的簡化,如:

        Collections.sort(names,(String a, String b) -> {    returnb.compareTo(a);});
  • 1
對於函式體只有一行程式碼的,你可以去掉大括號{}以及return關鍵字。如:
  • 1
Collections.sort(names,(String a, String b) -> b.compareTo(a));

或:Collections.sort(names, (a, b) -> b.compareTo(a));
  • 1
  • 2
  • 3

3.函式式介面:是指僅僅只包含一個抽象方法的介面,要加@FunctionalInterface註解  4.使用 :: 關鍵字來傳遞方法或者建構函式引用  5.多重註解  6.還增加了很多與函式式介面類似的介面以及與Map相關的API等……

JDK9  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 模組類或介面來源的資訊。

5.集合工廠方法

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

Set<Integer>  ints = Set.of(1,2,3);

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

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

6.改進的 Stream API

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

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

第二個引數是一個 Lambda,它會在當前 IntStream 中的元素到達 100 的時候返回 true。因此這個簡單的示例是向控制檯列印 1 到 99。

除了對 Stream 本身的擴充套件,Optional 和 Stream 之間的結合也得到了改進。現在可以通過 Optional 的新方法 stram 將一個 Optional 物件轉換為一個(可能是空的) Stream 物件:

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

在組合複雜的 Stream 管道時,將 Optional 轉換為 Stream 非常有用。  7.私有介面方法

使用 Java 9,您可以向介面新增私有輔助方法來解決此問題:

publicinterface MyInterface {
    voidnormalInterfaceMethod();
   default void interfaceMethodWithDefault() {  init(); }
    default void anotherDefaultMethod() { init(); }

This method is not part of the public API exposed by MyInterface

    privatevoid

init() { System.out.println("Initializing");
 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

如果您使用預設方法開發 API ,那麼私有介面方法可能有助於構建其實現。  8. HTTP/2

Java 9 中有新的方式來處理 HTTP 呼叫。這個遲到的特性用於代替老舊的 HttpURLConnection API,並提供對 WebSocket 和 HTTP/2 的支援。注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器模組交付。也就是說,這套 API 不能保證 100% 完成。不過你可以在 Java 9 中開始使用這套 API:

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, tpResponse.BodyHandler.asString());
HttpResponse<String> resp = client.send(req,HttpResponse.BodyHandler.asString());
  • 1
  • 2
  • 3
  • 4

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

9.多版本相容 JAR

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

multirelease.jar

├──  META-INF

│  └── versions

│  └── 9

│  └── multirelease

│  └── Helper.class

├──  multirelease

├──
  • 1

Helper.class

└──
  • 1

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 的主要功能包括:  一個區域性變數型別推斷,通過增強語言特性將型別推斷擴充套件到區域性變數,目的是減少與編碼相關的“儀式”,同時保持對靜態型別的安全承諾。  一個乾淨的垃圾收集器介面,用來改善垃圾收集器原始碼之間的隔離效果,這樣可以為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 中提供其他新的功能。