Java 11 特性

我們尚未完全投入到Java 10中,而Java 11已經出現了。 Java 11之所以重要,原因不僅僅是一點。 Oracle已重新調整了其支持模型,並提出了一個每6個月左右進行快速更新的發布系列。 他們改變了許可和支持模型,這意味著如果您下載Java 11 Oracle JDK,則需要支付商業用途的費用。

這是否意味著我現在需要支付Java的費用?不一定。除非您下載Oracle JDK並在生產中使用它。

注意: IntelliJ IDEA 2018.2.4 Community Edition已支持Java 11。

1. Java 11為何重要?

Java 11是Java 8之後的第二個LTS版本。自Java 11以來,Oracle JDK將不再免費供商業使用。您可以在開發階段使用它,但要在商業上使用,您需要購買許可證。如果您不這樣做,您隨時可以收到Oracle的發票帳單!Java 10是最後一個可以下載的免費Oracle JDK。自2019年1月起,Oracle停止支持Java 8。您需要支付更多的支持費用。您可以繼續使用它,但將不會收到任何補丁/安全更新。

自Java 11以來,Oracle將不再為任何單個Java版本提供免費的長期支持(LTS)。

雖然 Oracle JDK 不再免費,但您始終可以從 Oracle 或其他供應商(如 AdoptOpenJDK、Azul、IBM、Red Hat 等)下載 Open JDK 的版本。在我看來,除非您尋求企業級使用並願意支付支援費用,否則您可以使用 OpenJDK 並在必要時升級。

由於 Oracle 建立了一個每六個月推出一個新版本的發布系列,如果您使用 Oracle 的免費 Open JDK,您將需要每六個月更新一次,因為一旦推出新版本,Oracle 就不再提供免費更新。這可能對公司來說是一個挑戰。支付 Oracle 的商業支援費用,並僅從一個 LTS 版本遷移到下一個 LTS 版本。這樣,您將獲得對 Java 11 直到 2026 年的所有更新和支援。您可以在 2022 年下載 Java 17。即使支援結束後,仍保持使用免費的 Java 版本。儘管您將不會獲得安全更新,這可能會開啟安全漏洞。

Oracle 不會為 Java 9 和 Java 10 提供商業支援或更新。您需要尋找其他替代版本以便免費使用。

了解了Java 11帶來的包袱後,現在讓我們分析Java 11對開發人員的重要功能。我們也將討論一些重要的JEP。注意:JavaFX將作為獨立模塊提供,不會與Java JDK的6個月發布週期綁定。

3. 如何下載Java 11免費版本?

您可以從這個 連結 下載生產就緒的OpenJDK版本。二進制文件以tar或zip格式提供,只需解壓縮它們並設置環境變數以使用Java編譯器和Java命令。

4. Java 11功能

一些重要的Java 11功能包括:

  • 使用單個命令運行Java文件
  • String類中的新實用方法
  • 用於Lambda參數的本地變數語法
  • 基於嵌套的訪問控制
  • JEP 321: HTTP客戶端
  • 將字符串從文件讀取/寫入文件
  • JEP 328: 飛行記錄器

讓我們討論Java 11中通過JEP進程引入的新功能。

4.1) 使用單個命令運行Java文件

一個主要的變化是,您不需要首先使用javac工具編譯java源文件。您可以直接使用java命令運行文件,它會隱式地編譯。這個功能屬於JEP 330。以下是Java 11中引入的Java String類的新方法的一個 sneak peek:

4.2) Java String方法

isBlank() – 這個實例方法返回一個布爾值。空字符串和只包含空白字符的字符串被視為空白。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // 您的代碼在這裡!
        
        System.out.println(" ".isBlank()); //true
        
        String s = "Anupam";
        System.out.println(s.isBlank()); //false
        String s1 = "";
        System.out.println(s1.isBlank()); //true
    }
}

lines() 這個方法返回一個字符串流,其中包含所有按行拆分的子字符串的集合。

import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws Exception {
        
        String str = "JD\nJD\nJD"; 
        System.out.println(str);
        System.out.println(str.lines().collect(Collectors.toList()));
    }
}

上面代碼的輸出是: strip(), stripLeading(), stripTrailing() strip() – 從字符串的開頭和結尾刪除空白字符。

但我們已經有trim()。那strip()有什麼需要呢? strip()trim() 的“Unicode-aware”進化版本。當 trim() 被引入時,Unicode還沒有發展。現在,新的strip()移除所有類型的前導和尾隨空白(檢查方法Character.isWhitespace(c)來確定一個Unicode是否是空白)

下面給出了使用上述三種方法的示例:

public class Main {
    public static void main(String[] args) throws Exception {
        // 在此輸入您的代碼!
        
        String str = " JD "; 
        System.out.print("Start");
        System.out.print(str.strip());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripLeading());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripTrailing());
        System.out.println("End");
    }
}

上述代碼在控制台中的輸出是: repeat(int) repeat方法簡單地將字符串重複指定的次數,該次數以int形式在方法中提及。

public class Main {
    public static void main(String[] args) throws Exception {
        // 在此輸入您的代碼!
        
        String str = "=".repeat(2);
        System.out.println(str); //prints ==
    }
}

4.3) Lambda參數的區域變量語法

JEP 323,局部變數語法用於 Lambda 參數是 Java 11 中唯一的語言特性釋出。在 Java 10 中,局部變數類型推斷被引入。因此,我們可以從右手邊推斷變數的類型 – var list = new ArrayList<String>(); JEP 323 允許使用var來聲明隱式類型的 Lambda 表達式的形式參數。我們現在可以定義:

(var s1, var s2) -> s1 + s2

這在 Java 8 中也是可能的,但在 Java 10 中被刪除了。現在在 Java 11 中恢復了,以保持一致性。但為什麼需要這個,當我們可以在 lambda 中省略類型?如果你需要應用一個注釋,比如@Nullable,你不能在不定義類型的情況下這麼做。這個特性的限制 – 您必須在所有參數上指定 var 類型,或者都不指定。像下面這樣的事情是不可能的:

(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed

var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.

4.4) 基於嵌套的訪問控制

在 Java 11 之前,這是可能的:

public class Main {
 
    public void myPublic() {
    }
 
    private void myPrivate() {
    }
 
    class Nested {
 
        public void nestedPublic() {
            myPrivate();
        }
    }
}

主類的私有方法可以從上述嵌套類中以上述方式訪問。但如果我們使用 Java 反射,它將引發IllegalStateException

Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);

Java 11 的巢狀訪問控制解決了反射中的這個問題。 java.lang.Class 在反射 API 中引入了三個方法: getNestHost()getNestMembers()isNestmateOf()

4.5) JEP 309: 動態類文件常量

Java 類文件格式現在擴展了對新常量池形式 CONSTANT_Dynamic 的支持。這個 JEP 的目標是通過創建一個可以使用用戶提供的行為進行參數化的單一新常量池形式,來減少開發新形式的可實現類文件約束的成本和干擾。這可以增強性能。

4.6) JEP 318: Epsilon:一個無操作垃圾收集器

與負責分配內存並釋放內存的 JVM GC 不同,Epsilon 只分配內存。它為以下事項分配內存:

  • 性能測試。
  • 內存壓力測試。
  • VM 接口測試。
  • 極短壽命的作業。
  • 最後壓垮延遲改進。
  • 最後壓垮吞吐量改進。

现在 Elipson 只适用于测试环境。在生产环境中,它会导致 OutOfMemoryError 并使应用程序崩溃。Elipson 的好处是没有内存清理开销。因此,它将提供准确的性能测试结果,并且我们不能再使用 GC 来停止它。注意:这是一个实验性功能。

4.7) JEP 320:移除 Java EE 和 CORBA 模块

这些模块已在 Java 9 中被弃用。它们现在已被完全移除。以下包已被移除:java.xml.wsjava.xml.bindjava.activationjava.xml.ws.annotationjava.corbajava.transactionjava.se.eejdk.xml.wsjdk.xml.bind

4.8) JEP 328:飞行记录器

飞行记录器之前曾是 Oracle JDK 中的商业附加组件,现在已经开源,因为 Oracle JDK 自身不再免费。JFR 是一个性能分析工具,用于从运行中的 Java 应用程序中收集诊断和分析数据。它的性能开销可以忽略不计,通常低于 1%。因此,它可以在生产应用中使用。

4.9) JEP 321: HTTP 客户端

Java 11 规范化了 Http 客户端 API。新 API 支持 HTTP/1.1 和 HTTP/2。它旨在提高客户端发送请求和服务器接收响应的整体性能。它还原生支持 WebSocket。

4.10) 读取/写入字符串到文件

Java 11 旨在使字符串的读取和写入更加方便。它引入了以下方法用于读取和写入文件:

  • readString()
  • writeString()

以下代码展示了一个示例

Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on JD

4.11) JEP 329: ChaCha20 和 Poly1305 密碼算法

Java 11 提供了 ChaCha20 和 ChaCha20-Poly1305 的密碼算法實現。這些算法將在 SunJCE 提供程序中實現。

4.12) JEP 315: 改進 Aarch64 內部功能

改進現有的字符串和數組內部功能,並為 AArch64 處理器的 java.lang.Math sin、cos 和 log 函數實現新的內部功能。

4.13) JEP 333: ZGC: 可擴展低延遲垃圾收集器(實驗性)

Java 11 引入了低延遲的 GC。這是一個實驗性的功能。很高興看到 Oracle 重視 GC。

4.14) JEP 335: 棄用 Nashorn JavaScript 引擎

Nashorn JavaScript 腳本引擎和 API 現已棄用,表明它們將在後續版本中被移除。

5. 結論

我們已經介紹了 Java 11 中提供的重要功能和更新。期待在 Java 12 發布時再次見面。

Source:
https://www.digitalocean.com/community/tutorials/java-11-features