JDK各個版本的區別

原地址:https://blog.csdn.net/papima/article/details/78219001

jdk1.5的新特性:


1. 泛型
   ArrayList list=new ArrayList()------>ArrayList<Integer>list=new ArrayList<Integer>();


2 自動裝箱/拆箱
   nt i=list.get(0).parseInt();-------->int i=list.get(0);原始類型與對應的包裝類不用顯式轉換


3 for-each
   i=0;i<a.length;i++------------>for(int i:a){......}


4 static import
   Math.sqrt();--------------->sqrt();


5 變長參數
   int sum(int ...intlist)有任意個參數,把他看作數組


jdk1.6的新特性


1.增強的for循環語句
Integer[] numbers = computeNumbers();
for (int i=0; i < numbers.length ; i++)
sum += numbers[i];
||
int sum = 0;
for ( int number: computeNumbers() )
sum += number;


2.監視和管理
Java SE 6中對內存泄漏增強了分析以及診斷能力。當遇到java.lang.OutOfMemory異常的時候,可以得到一個完整的堆棧信息,
並且當堆已經滿了的時候,會產生一個Log文件來記錄這個致命錯誤。另外,JVM還添加了一個選項,允許你在堆滿的時候運行腳本。


3.插入式註解處理
插入式註解處理API(JSR 269)提供一套標準API來處理Annotations


4.安全性


jdk1.7的新特性
1.模塊化特性
Java7也是採用了模塊的劃分方式來提速,一些不是必須的模塊並沒有下載和安裝,當虛擬機需要的時候,再下載相應的模塊,
同時對啓動速度也有了很大的改善。


2.多語言支持
Java7的虛擬機對多種動態程序語言增加了支持,比如:Rubby、 Python等等。


3.開發者的開發效率得到了改善
switch中可以使用字符串
在多線程併發與控制方面:輕量級的分離與合併框架,一個支持併發訪問的HashMap等等。
通過註解增強程序的靜態檢查。
提供了一些新的API用於文件系統的訪問、異步的輸入輸出操作、Socket通道的配置與綁定、多點數據包的傳送等等。


4.執行效率的提高
對對象指針由64位壓縮到與32位指針相匹配的技術使得內存和內存帶塊的消耗得到了很大的降低因而提高了執行效率。
提供了新的垃圾回收機制(G1)來降低垃圾回收的負載和增強垃圾回收的效果。

 

JDK1.8的新特性

一、接口的默認方法
Java 8允許我們給接口添加一個非抽象的方法實現,只需要使用 default關鍵字即可,這個特徵又叫做擴展方法。

二、Lambda 表達式
在Java 8 中你就沒必要使用這種傳統的匿名對象的方式了,Java 8提供了更簡潔的語法,lambda表達式:
Collections.sort(names, (String a, String b) -> {

    return b.compareTo(a);

});

三、函數式接口
Lambda表達式是如何在java的類型系統中表示的呢?每一個lambda表達式都對應一個類型,通常是接口類型。而“函數式接口”是指僅僅只包含一個抽象方法的接口,每一個該類型的lambda表達式都會被匹配到這個抽象方法。因爲 默認方法 不算抽象方法,所以你也可以給你的函數式接口添加默認方法。 

四、方法與構造函數引用
Java 8 允許你使用 :: 關鍵字來傳遞方法或者構造函數引用,上面的代碼展示瞭如何引用一個靜態方法,我們也可以引用一個對象的方法:
converter = something::startsWith;

String converted = converter.convert("Java");

System.out.println(converted);

五、Lambda 作用域
在lambda表達式中訪問外層作用域和老版本的匿名對象中的方式很相似。你可以直接訪問標記了final的外層局部變量,或者實例的字段以及靜態變量六、訪問局部變量
可以直接在lambda表達式中訪問外層的局部變量:

七、訪問對象字段與靜態變量 
和本地變量不同的是,lambda內部對於實例的字段以及靜態變量是即可讀又可寫。該行爲和匿名對象是一致的:

八、訪問接口的默認方法
JDK 1.8 API包含了很多內建的函數式接口,在老Java中常用到的比如Comparator或者Runnable接口,這些接口都增加了@FunctionalInterface註解以便能用在lambda上。
Java 8 API同樣還提供了很多全新的函數式接口來讓工作更加方便,有一些接口是來自Google Guava庫裏的,即便你對這些很熟悉了,還是有必要看看這些是如何擴展到lambda上使用的。

 

JDK1.9 新特性

java 7 2011發佈,Java 8 2014發佈,java9發佈於2017年9月21日。 你可能已經聽說過 Java 9 的模塊系統,但是這個新版本還有許多其它的更新。 這裏有九個令人興奮的新功能將與 Java 9 一起發佈。

1. Java 平臺級模塊系統

Java 9 的定義功能是一套全新的模塊系統。當代碼庫越來越大,創建複雜,盤根錯節的“意大利麪條式代碼”的機率呈指數級的增長。這時候就得面對兩個基礎的問題: 很難真正地對代碼進行封裝, 而系統並沒有對不同部分(也就是 JAR 文件)之間的依賴關係有個明確的概念。每一個公共類都可以被類路徑之下任何其它的公共類所訪問到, 這樣就會導致無意中使用了並不想被公開訪問的 API。此外,類路徑本身也存在問題: 你怎麼知曉所有需要的 JAR 都已經有了, 或者是不是會有重複的項呢? 模塊系統把這倆個問題都給解決了。

模塊化的 JAR 文件都包含一個額外的模塊描述器。在這個模塊描述器中, 對其它模塊的依賴是通過 “requires” 來表示的。另外, “exports” 語句控制着哪些包是可以被其它模塊訪問到的。所有不被導出的包默認都封裝在模塊的裏面。如下是一個模塊描述器的示例,存在於 “module-info.java” 文件中:
我們可以如下展示模塊:

請注意,兩個模塊都包含封裝的包,因爲它們沒有被導出(使用橙色盾牌可視化)。 沒有人會偶然地使用來自這些包中的類。Java 平臺本身也使用自己的模塊系統進行了模塊化。通過封裝 JDK 的內部類,平臺更安全,持續改進也更容易。

當啓動一個模塊化應用時, JVM 會驗證是否所有的模塊都能使用,這基於 `requires` 語句——比脆弱的類路徑邁進了一大步。模塊允許你更好地強制結構化封裝你的應用並明確依賴。你可以在這個課程中學習更多關於 Java 9 中模塊工作的信息 。

 

2. Linking

當你使用具有顯式依賴關係的模塊和模塊化的 JDK 時,新的可能性出現了。你的應用程序模塊現在將聲明其對其他應用程序模塊的依賴以及對其所使用的 JDK 模塊的依賴。爲什麼不使用這些信息創建一個最小的運行時環境,其中只包含運行應用程序所需的那些模塊呢? 這可以通過 Java 9 中的新的 jlink 工具實現。你可以創建針對應用程序進行優化的最小運行時映像而不需要使用完全加載 JDK 安裝版本。

 

3. JShell : 交互式 Java REPL

許多語言已經具有交互式編程環境,Java 現在加入了這個俱樂部。您可以從控制檯啓動 jshell ,並直接啓動輸入和執行 Java 代碼。 jshell 的即時反饋使它成爲探索 API 和嘗試語言特性的好工具。

測試一個 Java 正則表達式是一個很好的說明 jshell 如何使您的生活更輕鬆的例子。 交互式 shell 還可以提供良好的教學環境以及提高生產力,您可以在此瞭解更多信息。在教人們如何編寫 Java 的過程中,不再需要解釋 “public static void main(String [] args)” 這句廢話。

 

4. 改進的 Javadoc

有時一些小事情可以帶來很大的不同。你是否就像我一樣在一直使用 Google 來查找正確的 Javadoc 頁面呢? 這不再需要了。Javadoc 現在支持在 API 文檔中的進行搜索。另外,Javadoc 的輸出現在符合兼容 HTML5 標準。此外,你會注意到,每個 Javadoc 頁面都包含有關 JDK 模塊類或接口來源的信息。

5. 集合工廠方法

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

1

2

  1. Set<Integer>

  2. ints = Set.of(

1,2,3);
  1. List<String>

  2. strings = List.of(

"first","second");

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

 

6. 改進的 Stream API

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

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

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

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

 

7. 私有接口方法

Java 8 爲我們帶來了接口的默認方法。 接口現在也可以包含行爲,而不僅僅是方法簽名。 但是,如果在接口上有幾個默認方法,代碼幾乎相同,會發生什麼情況? 通常,您將重構這些方法,調用一個可複用的私有方法。 但默認方法不能是私有的。 將複用代碼創建爲一個默認方法不是一個解決方案,因爲該輔助方法會成爲公共API的一部分。 使用 Java 9,您可以向接口添加私有輔助方法來解決此問題:

如果您使用默認方法開發 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 版本:

在上述場景中, multirelease.jar 可以在 Java 9 中使用, 不過 Helper 這個類使用的不是頂層的 multirelease.Helper 這個 class, 而是處在“META-INF/versions/9”下面的這個。這是特別爲 Java 9 準備的 class 版本,可以運用 Java 9 所提供的特性和庫。同時,在早期的 Java 諸版本中使用這個 JAR 也是能運行的,因爲較老版本的 Java 只會看到頂層的這個 Helper 類。

 

JDK10特性

1. 局部變量類型推斷

局部變量類型推斷可以說是Java 10中最值得注意的特性,這是Java語言開發人員爲了簡化Java應用程序的編寫而採取的又一步,如下圖所示。

這個新功能將爲Java增加一些語法糖 - 簡化它並改善開發者體驗。新的語法將減少與編寫Java相關的冗長度,同時保持對靜態類型安全性的承諾。

局部變量類型推斷將引入"var"關鍵字,也就是你可以隨意定義變量而不必指定變量的類型,如:

將被下面這個新語法所取代:

看完是不是有點JS的即視感???越來越像JS了嗎?!雖然類型推斷在Java中不是一個新概念,但在局部變量中確是很大的一個改進。

說到類型推斷,從JDK 5引進泛型,到JDK 7的"<>"操作符允許不綁定類型而初始化List,再到JDK 8的Lambda表達式,再到現在JDK 10的局部變量類型推斷,Java類型推斷正大刀闊斧的向前發展。

局部變量類型推薦僅限於如下使用場景:

局部變量初始化for循環內部索引變量傳統的for循環聲明變量Java官方表示,它不能用於以下幾個地方:

方法參數構造函數參數方法返回類型字段捕獲表達式(或任何其他類型的變量聲明)

 

2. GC改進和內存管理

JDK 10中有2個JEP專門用於改進當前的垃圾收集元素。

第一個垃圾收集器接口是(JEP 304),它將引入一個純淨的垃圾收集器接口,以幫助改進不同垃圾收集器的源代碼隔離。

預定用於Java 10的第二個JEP是針對G1的並行完全GC(JEP 307),其重點在於通過完全GC並行來改善G1最壞情況的等待時間。G1是Java 9中的默認GC,並且此JEP的目標是使G1平行。

 

3. 線程本地握手(JEP 312)

JDK 10將引入一種在線程上執行回調的新方法,因此這將會很方便能停止單個線程而不是停止全部線程或者一個都不停。

 

4. 備用內存設備上的堆分配(JEP 316)

允許HotSpot VM在備用內存設備上分配Java對象堆內存,該內存設備將由用戶指定。

 

5. 其他Unicode語言 - 標記擴展(JEP 314)

目標是增強java.util.Locale及其相關的API,以便實現語言標記語法的其他Unicode擴展(BCP 47)。

 

6. 基於Java的實驗性JIT編譯器

Oracle希望將其Java JIT編譯器Graal用作Linux / x64平臺上的實驗性JIT編譯器。

 

7. 根證書(JEP 319)

這個的目標是在Oracle的Java SE中開源根證書。

 

8. 根證書頒發認證

這將使OpenJDK對開發人員更具吸引力,它還旨在減少OpenJDK和Oracle JDK構建之間的差異。

 

9. 將JDK生態整合單個存儲庫(JEP 296)

此JEP的主要目標是執行一些內存管理,並將JDK生態的衆多存儲庫組合到一個存儲庫中。

 

10. 刪除工具javah(JEP 313)

從JDK中移除了javah工具,這個很簡單並且很重要。

 

Java 10嚐鮮

嚐鮮地址:http://openjdk.java.net/projects/jdk/10/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章