Java 11新特性

xiangzhihong發表於2019-03-04

概述

美國當地時間9月25日,Oracle 官方宣佈 Java 11 (18.9 LTS) 正式釋出,可在生產環境中使用!這是自 Java 8 後的首個長期支援版本,將支援到2026年,可以使用下面的地址進行下載:Java 11官方下載

版本更新說明

在Java的版本上,按照官方的說法,Java 的版本釋出週期變更為每六個月一次 —— 每半年釋出一個大版本,每個季度釋出一箇中間特性版本,並且承諾不會跳票。通過這樣的方式,開發團隊可以把一些關鍵特性儘早合併到 JDK 之中,以快速得到開發者反饋,在一定程度上避免出現像 Java 9 這樣兩次被迫延遲釋出的窘況。

在這裡插入圖片描述

按照官方的說法,新的釋出週期會嚴格遵循時間點,將於每年的3月份和9月份釋出。所以 Java 11 的版本號是 18.9(LTS)。不過與 Java 9 和 Java 10 這兩個被稱為“功能性的版本”不同(兩者均只提供半年的技術支援),Java 11 不僅提供了長期支援服務,還將作為 Java 平臺的參考實現。Oracle 直到2023年9月都會為 Java 11 提供技術支援,而補丁和安全警告等擴充套件支援將持續到2026年。

許可證

按照官方的說法,從 Java 11 開始,Oracle 將在 GPLv2 許可證下提供 JDK 版本,採用 Classpath Exception (GPLv2+CPE) 的方式,滿足了在商業許可下使用 Oracle JDK 作為 Oracle 產品或服務的一部分,或者不想使用開源軟體的需求。這種使用開源許可證和商業許可證的組合取代了歷史上的“BCL”許可證,該許可證具有免費和付費商業條款的組合。

新特性

根據官網的公開資訊,此處的Java 11主要更新了 17 個 JEP。

181: Nest-Based Access Control(基於巢狀的訪問控制)

309: Dynamic Class-File Constants(動態的類檔案常量)

315: Improve Aarch64 Intrinsics(改進 Aarch64 Intrinsics)

318: Epsilon: A No-Op Garbage Collector(Epsilon 垃圾回收器,又被稱為”No-Op(無操作)”回收器)

320: Remove the Java EE and CORBA Modules(移除 Java EE 和 CORBA 模組,JavaFX 也已被移除)

321: HTTP Client (Standard)

323: Local-Variable Syntax for Lambda Parameters(用於 Lambda 引數的區域性變數語法)

324: Key Agreement with Curve25519 and Curve448(採用 Curve25519 和 Curve448 演算法實現的金鑰協議)

327: Unicode 10

328: Flight Recorder(飛行記錄儀)

329: ChaCha20 and Poly1305 Cryptographic Algorithms(實現 ChaCha20 和 Poly1305 加密演算法)

330: Launch Single-File Source-Code Programs(啟動單個 Java 原始碼檔案的程式)

331: Low-Overhead Heap Profiling(低開銷的堆分配取樣方法)

332: Transport Layer Security (TLS) 1.3(對 TLS 1.3 的支援)

333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)(ZGC:可伸縮的低延遲垃圾回收器,處於實驗性階段)

335: Deprecate the Nashorn JavaScript Engine(棄用 Nashorn JavaScript 引擎)

336: Deprecate the Pack200 Tools and API(棄用 Pack200 工具及其 API)

新特性體驗

那麼,作為一名Java程式猿,Java 11究竟帶來了哪些改變呢,對於我們寫程式碼會有什麼幫助呢?

1,在Lambda表示式中使用var

本地變數型別var是java 10提出的新概念,它可以從上下文中推斷出本地變數的型別,從而提高程式碼可讀性。

public class Main {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://www.oracle.com/");
        URLConnection conn = url.openConnection();
        Reader reader = new BufferedReader(
                new InputStreamReader(conn.getInputStream()));
    }
}
複製程式碼

使用var宣告後,上面的程式碼可以改寫成:

public class Main {
    public static void main(String[] args) throws Exception {
        var url = new URL("http://www.oracle.com/");
        var conn = url.openConnection();
        var reader = new BufferedReader(
                new InputStreamReader(conn.getInputStream()));
    }
}
複製程式碼

在上面的程式碼中,我們使用var代替了URL、URLConnection、Reader,提高了程式碼的可讀性,也方便了開發。 但是在JAVA 10中,var變數不能在lambda表示式中宣告,在JAVA 11中,解決了這個問題。現在,我們可以在lambda表示式中使用var,例如:

(var x, var y) -> x.process(y)
//等價於
(x, y) -> x.process(y)
複製程式碼

2,標準化的HTTP Client API

以前我們在程式中使用HttpClient時,通常會引入apache的HttpClient工具包。現在,我們可以使用JDK原生的 HttpClient。

public class HttpTest {
    public static void main(String[] args) throws Exception {
        String uri = "http://www.oracle.com/";
 
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(uri))
                .build();
 
        HttpResponse<String> response =
                client.send(request, HttpResponse.BodyHandlers.ofString());
 
        System.out.println(response.body());
    }
}
複製程式碼

上面的例子是同步的get請求,還有其他的方法HttpClient也是提供的,例如:非同步get、post提交、併發請求、Get Json和Post Json等。更多資料請檢視附件的連結:

JDK 11 釋出說明

JDK 11 官方文件

JDK 11 新特性

相關文章