JDK各個版本比較 JDK5~JDK9

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」];//取
  2. 在Switch中可用String
  3. 數值可加下劃線用做分隔符(編譯時自動被忽略)
  4. 支持二進制數字,如:int binary= 0b1001_1001;
  5. 簡化了可變參數方法的調用
  6. 調用泛型類的構造方法時,能夠省去泛型參數,編譯器會自動判斷。
  7. Boolean類型反轉,空指針安全,參與位運算
  8. char類型的equals方法:
    boolean Character.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);}); //對於函數體只有一行代碼的,你能夠去掉大括號{}以及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等……

 

JDK9

    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");

      除了更短和更好閱讀以外,這些方法也能夠避免您選擇特定的集合實現。 事實上,從工廠方法返回已放入數個元素的集合實現是高度優化的。這是可能的,由於它們是不可變的:在建立後,繼續添加元素到這些集合會致使 「UnsupportedOperationException」 。javascript

    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);
      第二個參數是一個 Lambda,它會在當前 IntStream 中的元素到達 100 的時候返回 true。所以這個簡單的示例是向控制檯打印 1 到 99。
      除了對 Stream 自己的擴展,Optional 和 Stream 之間的結合也獲得了改進。如今能夠經過 Optional 的新方法 stream 將一個 Optional 對象轉換爲一個(多是空的) Stream 對象:
      Stream s = Optional.of(1).stream();
      在組合複雜的 Stream 管道時,將 Optional 轉換爲 Stream 很是有用。
    7. 私有接口方法
      使用 Java 9,您能夠向接口添加私有輔助方法來解決此問題:
      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 ,那麼私有接口方法可能有助於構建其實現。java

    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());

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

    9. 多版本兼容 JAR
      咱們最後要來着重介紹的這個特性對於庫的維護者而言是個特別好的消息。當一個新版本的 Java 出現的時候,你的庫用戶要花費數年時間纔會切換到這個新的版本。這就意味着庫得去向後兼容你想要支持的最老的 Java 版本 (許多狀況下就是 Java 6 或者 7)。這實際上意味着將來的很長一段時間,你都不能在庫中運用 Java 9 所提供的新特性。幸運的是,多版本兼容 JAR 功能能讓你建立僅在特定版本的 Java 環境中運行庫程序時選擇使用的 class 版本
相關文章
相關標籤/搜索