Java 12 新特性


Java 12 新特性的介紹

2019年3月19日,Java 12 正式釋出。Java 12 版本中包含的若干新特性和增強功能幾乎在各個方面都使其成為對 Java 11 的重大升級。開關表示式、預設 CDS 歸檔、Shenandoah 和微基準測試套件是 Java 12 中值得特別提及的幾個特性。

這些特性旨在提高 Java 的生產力、可用性和對開發人員的多功能性。在本文中,我們將深入探討這些新功能。

開關表示式 (JEP 325)

值得注意的是,Java 12 對開關表示式進行了顯著改進。它們現在既可以用作語句,也可以用作表示式,從而簡化了程式碼,並允許在 switch 中進行模式匹配。

過去,不包含 break 語句可能會導致預設貫穿執行,這是 Java 程式碼中常見錯誤的一個主要原因。然而,在 Java 12 的最新更新中,開關表示式中的預設情況現在是強制性的,從而避免了此類問題。開關表示式特性的這些修改提高了 Java 12 作為開發人員程式語言的效率和可靠性。

讓我們透過示例程式碼來了解傳統的 switch 語句 (Java 11) 與 Java 12 的區別。

Stream API 中的 Collectors.teeing()

作為一種靜態方法,teeing 收集器已可用。Collectors::teeing。此收集器將其輸入傳送到另外兩個收集器,然後這兩個收集器使用一個函式組合其輸出。

可以向 teeing(Collector, Collector, BiFunction) 提供兩個收集器,以及一個用於組合資料的函式。兩個下游收集器分別處理傳遞給結果收集器的每個元素,並且使用所述合併函式將它們的處理輸出與最終收集器的輸出組合。

演算法

  • 步驟 1 - 首先,我們需要建立一個 8 到 14 之間的整數流。

  • 步驟 2 - 接下來,我們可以使用 Java 12 中新新增的 Collectors.teeing() 函式構建的收集器來確定流中整數的平均值。

  • 步驟 3 - Collectors.teeing() 方法使用兩個收集器和一個函式來合併它們的輸出以計算平均值。

  • 步驟 4 - 最後,將計算出的平均值列印到控制檯以顯示。

示例 1

此程式演示如何使用 Collectors.teeing() 方法計算整數流的平均值。

import java.util.stream.Collectors;
import java.util.stream.Stream;

public class APITester {
   public static void main(String[] args) {
      double mean
         = Stream.of(8, 9, 10, 11, 12, 13, 14)
            .collect(Collectors.teeing(
               Collectors.summingDouble(i -> i), Collectors.counting(),
               (sum, n) -> sum / n));

      System.out.println(mean);
   }
}

輸出

11.0

Shenandoah

你聽說過 Shenandoah 嗎?這是一個新的改進的垃圾收集器,儘管它仍處於實驗階段。此 GC 演算法透過與正在執行的 Java 執行緒同時執行疏散工作來提供低暫停時間。這意味著暫停時間不依賴於堆大小。無論是小的 5MB 堆還是巨大的 10GB 堆,暫停時間都將相同。

JVM 常量 API

如果你正在使用操作類和方法的程式,JVM 常量 API 可能是你的寶貴工具。在這些型別的程式中,需要建模位元組碼指令並處理可載入的常量。雖然 String 或 Integer 型別的常量通常不會出現問題,但 Class 型別的常量可能會更具挑戰性。如果類不可訪問或不存在,則載入類可能會失敗。

好訊息是,新的 API 透過使用 ClassDesc、MethodTypeDesc、MethodHandleDesc 和 DynamicConstantDesc 等介面來象徵性地處理常量值,簡化了問題。這種方法消除了處理類常量時涉及的許多複雜性,從而更容易在程式中操作和管理它們。

預設 CDS 歸檔

類資料共享 (CDS) 是一項重要功能,它可以減少多個 Java 虛擬機器上的啟動時間和記憶體佔用。它透過利用構建時生成的預設類列表來實現此目的,該列表包含必要的核心庫類。

在 Java 12 中,此功能有所改變 - CDS 歸檔現在預設啟用。要停用 CDS 並執行沒有它的程式,我們需要手動將 Xshare 標誌設定為“off”。

針對 G1 的可中止混合收集 (JEP 344)

設定為預設的垃圾優先 (G1) 垃圾收集器擁有一個令人印象深刻的分析引擎,用於確定收集集。一旦啟動該過程,它旨在不間斷地收集所有活動物件。但是,當目標暫停時間超過時,此方法有時會導致效能問題。

為了解決這個問題,G1 收集集現在被分成可選部分和強制部分,允許該過程可中止。優先處理強制集通常可以確保達到目標暫停時間,防止收集過程超過其限制。此技術對於使 G1 垃圾收集器高效執行至關重要,不會造成任何重大的效能問題。

微基準測試套件 (JEP 230)

此最新補充對於開發人員來說是一個改變遊戲規則的功能,他們現在可以輕鬆地建立和執行微基準測試。微基準測試是用於衡量單個程式碼片段或方法的有效性的關鍵工具。它們有助於查明效能障礙並增強程式碼以最大限度地提高效率。

使用新推出的微基準測試套件,開發人員現在可以毫不費力地執行預先存在的微基準測試或建立新的微基準測試。該套件已智慧地整合到 JDK 原始碼中,這意味著開發人員可以無縫地對其程式碼進行基準測試。

預設類資料共享歸檔 (JEP 341)

Java 12 中改進了 CDS(預設類資料共享)歸檔建立過程。64 位平臺上的 JDK 構建過程使用預設類列表來實現此目的。因此,建立 CDS 歸檔的過程得到了改進和簡化。

從 G1 快速返回未使用的已提交記憶體 (JEP 346)

由於 JEP 346,Java 12 中的 G1 垃圾收集器現在可以快速將未充分利用的已提交記憶體返回給作業系統。在 Java 11 中,G1 垃圾收集在空閒時無法將 Java 堆記憶體返回給作業系統,因此這是一個升級。由於 G1 垃圾收集器,Java 12 提供了增強的記憶體管理能力,從而更有效地利用系統資源。

Files.mismatch() 方法

介紹“Files.mismatch()”,這是一種新技術,可以啟用檔案比較。此實用函式的簽名是“public static long mismatch(Path path1, Path path2) throws IOException”,如果沒有任何不匹配,則返回 -1L。如果存在不匹配,則會提供第一個不匹配的位置。

兩種不同的情況可能導致不匹配:

  • 首先,如果檔案大小不同,則該方法將返回較小的檔案大小。

  • 此外,如果檔案的位元組不匹配,它將報告第一個不同位元組的位置。

結論

Java 12 擁有增強開發人員程式設計的新特性。透過開關表示式、Stream API 中的 collectors.teeing() 和 Shenandoah,Java 現在更高效、更可靠。JVM 常量 API、預設 CDS 歸檔、針對 G1 的可中止混合收集和微基準測試套件使 Java 更加高效和多功能。這些升級簡化了程式碼並提高了應用程式的魯棒性。

更新於:2023年5月15日

230 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告