JDK各版本的新特性java
1、jdk1.5的新特性正則表達式
1. 泛型shell
[Java]純文本查看__複製代碼編程
?數組
1安全
2多線程
ArrayList list=
`new
ArrayList();`併發
------>ArrayList<Integer>list=
`new
ArrayList<Integer>();`框架
2. 自動裝箱/拆箱異步
[Java]純文本查看__複製代碼
1
2
int
i=list.get(
`0`).parseInt();
-------->
`int
i=list.get(0
);`
原始類型與對應的包裝類不用顯式轉換
3. for-each
[Java]純文本查看__複製代碼
1
2
3
for
`( i=0
;i<a.length;i++){......}`
------------>
`for(
int
i:a){......}`
4 static import
Math.sqrt();--------------->sqrt();
5 變長參數(可變參數)
int sum(int ...intlist)有任意個參數,把他看做數組
2、jdk1.6的新特性
1.加強的for循環語句
[Java]純文本查看__複製代碼
1
2
3
4
5
6
7
8
Integer[] numbers = computeNumbers();
int
sum =
0
`;`
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.安全性
_
3、jdk1.7的新特性
_
1.模塊化特性
Java7也是採用了模塊的劃分方式來提速,一些不是必須的模塊並無下載和安裝,當虛擬機須要的時候,再下載相應的模塊,同時對啓動速度也有了很大的改善。
2.多語言支持
Java7的虛擬機對多種動態程序語言增長了支持,好比:Rubby、 Python等等。
3.開發者的開發效率獲得了改善
switch中可使用字符串
在多線程併發與控制方面:輕量級的分離與合併框架,一個支持併發訪問的HashMap等等。
經過註解加強程序的靜態檢查。
提供了一些新的API用於文件系統的訪問、異步的輸入輸出操做、Socket通道的配置與綁定、多點數據包的傳送等等。
4.執行效率的提升
對對象指針由64位壓縮到與32位指針相匹配的技術使得內存和內存帶塊的消耗獲得了很大的下降於是提升了執行效率。
提供了新的垃圾回收機制(G1)來下降垃圾回收的負載和加強垃圾回收的效果。
_
4、JDK1.8的新特性:、
_
一、接口的默認方法
Java 8容許咱們給接口添加一個非抽象的方法實現,只須要使用default關鍵字便可,這個特徵又叫作擴展方法。
二、Lambda 表達式
在Java 8 中你就不必使用這種傳統的匿名對象的方式了,Java 8提供了更簡潔的語法,lambda表達式:
[Java]純文本查看__複製代碼
1
2
3
Collections.sort(names, (String a, String b) -> {
return
b.compareTo(a);
});
三、函數式接口
Lambda表達式是如何在java的類型系統中表示的呢?每個lambda表達式都對應一個類型,一般是接口類型。而「函數式接口」是指僅僅只包含一個抽象方法的接口,每個該類型的lambda表達式都會被匹配到這個抽象方法。由於 默認方法 不算抽象方法,因此你也能夠給你的函數式接口添加默認方法。
四、方法與構造函數引用
Java 8 容許你使用 :: 關鍵字來傳遞方法或者構造函數引用,上面的代碼展現瞭如何引用一個靜態方法,咱們也能夠引用一個對象的方法:
[Java]純文本查看__複製代碼
1
2
3
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上使用的。
_
5、JDK1.9 新特性
1. Java 平臺級模塊系統
Java 9 的定義功能是一套全新的模塊系統。當代碼庫愈來愈大,建立複雜,盤根錯節的「意大利麪條式代碼」的概率呈指數級的增加。這時候就得面對兩個基礎的問題: 很難真正地對代碼進行封裝, 而系統並無對不一樣部分(也就是 JAR 文件)之間的依賴關係有個明確的概念。每個公共類均可以被類路徑之下任何其它的公共類所訪問到, 這樣就會致使無心中使用了並不想被公開訪問的 API。此外,類路徑自己也存在問題: 你怎麼知曉全部須要的 JAR 都已經有了, 或者是否是會有重複的項呢? 模塊系統把這倆個問題都給解決了。
模塊化的 JAR 文件都包含一個額外的模塊描述器。在這個模塊描述器中, 對其它模塊的依賴是經過 「requires」 來表示的。另外, 「exports」 語句控制着哪些包是能夠被其它模塊訪問到的。全部不被導出的包默認都封裝在模塊的裏面。以下是一個模塊描述器的示例,存在於 「module-info.java」 文件中:
_
[Java]純文本查看__複製代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
module
blog {
exports
com.pluralsight.blog;
requires
cms;
}
_
咱們能夠以下展現模塊:
請注意,兩個模塊都包含封裝的包,由於它們沒有被導出(使用橙色盾牌可視化)。 沒有人會偶然地使用來自這些包中的類。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,添加了幾種集合工廠方法:
_
[Java]純文本查看__複製代碼
1
2
3
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 (判斷條件)來指定何時結束迭代:
_
[Java]純文本查看__複製代碼
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 對象:
_
[Java]純文本查看__複製代碼
1
Stream<Integer> s = Optional.of(
`1`).stream();
_
在組合複雜的 Stream 管道時,將 Optional 轉換爲 Stream 很是有用。
7. 私有接口方法
Java 8 爲咱們帶來了接口的默認方法。 接口如今也能夠包含行爲,而不只僅是方法簽名。 可是,若是在接口上有幾個默認方法,代碼幾乎相同,會發生什麼狀況? 一般,您將重構這些方法,調用一個可複用的私有方法。 但默認方法不能是私有的。 將複用代碼建立爲一個默認方法不是一個解決方案,由於該輔助方法會成爲公共API的一部分。 使用 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");}
}
8. HTTP/2
Java 9 中有新的方式來處理 HTTP 調用。這個遲到的特性用於代替老舊的 `HttpURLConnection` API,並提供對 WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器模塊交付。也就是說,這套 API 不能保證 100% 完成。不過你能夠在 Java 9 中開始使用這套 API:
_
[Java]純文本查看__複製代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
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());
_
除了這個簡單的請求/響應模型以外,HttpClient 還提供了新的 API 來處理 HTTP/2 的特性,好比流和服務端推送。
9. 多版本兼容 JAR
咱們最後要來着重介紹的這個特性對於庫的維護者而言是個特別好的消息。當一個新版本的 Java 出現的時候,你的庫用戶要花費數年時間纔會切換到這個新的版本。這就意味着庫得去向後兼容你想要支持的最老的 Java 版本 (許多狀況下就是 Java 6 或者 7)。這實際上意味着將來的很長一段時間,你都不能在庫中運用 Java 9 所提供的新特性。幸運的是,多版本兼容 JAR 功能能讓你建立僅在特定版本的 Java 環境中運行庫程序時選擇使用的 class 版本:
_
[Java]純文本查看__複製代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 類。
6、JDK10 新特性
1. 新增局部變量類型推斷 var
_
[Java]純文本查看__複製代碼
1
2
3
var a =
"aa"
`;`
System.out.println(a);
_
var 關鍵字目前只能用於局部變量以及 for 循環變量聲明中。
2. 刪除工具 javah
從JDK中移除了 javah 工具,使用 javac -h 代替。
3. 統一的垃圾回收接口,改進了 GC 和其餘內務管理
4. 其餘新特性
ThreadLocal 握手交互 JDK 10 引入一種在線程上執行回調的新方法,很方便的中止單個線程而不是中止所有線程或者一個都不停。
基於Java的實驗性JIT編譯器 Java 10 開啓了 Java JIT編譯器 Graal,用做Linux / x64平臺上的實驗性JIT編譯器。
提供默認的 CA 根證書
將 JDK 生態整合到單個倉庫 此JEP的主要目標是執行一些內存管理,並將JDK生態的衆多存儲庫組合到一個存儲庫中。
7、JDK11 新特性
1. Lambda 表達式中使用 var
(var x, var y) -> x.process(y)
2. 字符串 API 加強
Java 11 新增了 一系列字符串處理方法,例如:
_
[Java]純文本查看__複製代碼
1
2
3
4
5
6
7
// 判斷字符串是否爲空白
" "
`.isBlank;`
" Javastack "
`.stripTrailing;
// " Javastack"`
" Javastack "
`.stripLeading;
// "Javastack "`
_
3. 標準化 HTTPClient API
4. java 命令直接編譯運行 java
省去中間步驟 javac 生成 class 文件。
5. 增長對 TLS 1.3 的支持
JDK12 新特性
switch 表達式
Java 12 之後,switch 不只能夠做爲語句,也能夠做爲表達式。
_
[Java]純文本查看__複製代碼
01
02
03
04
05
06
07
08
09
10
11
private
String switchTest(
int
i ){
return
switch
`( i ) {`
case
1
`->
"1"`;
default
`->
"0"`;
};
}
_