Java 開發工具包(JDK) 21 是 Oracle 標準 Java 實現的最新長期支持 (LTS) 版本,現已推出生產版本。比較實用的我看就5個,字符串模板、有序集合、記錄模式、switch的模式匹配、虛擬線程,其他一般也用不大到。
對現有Java字符串處理進行增強。包括兩個模板處理器STR和FMT。簡單示例:
STR模板處理器:
String firstName = "Bill";String lastName = "Duck";String fullName = STR."/{firstName} /{lastName}";| "Bill Duck"String sortName = STR."/{lastName}, /{firstName}";| "Duck, Bill"
FMT模板處理器:
String table = FMT.""" Description Width Height Area %-12s/{zone[0].name} %7.2f/{zone[0].width} %7.2f/{zone[0].height} %7.2f/{zone[0].area()} %-12s/{zone[1].name} %7.2f/{zone[1].width} %7.2f/{zone[1].height} %7.2f/{zone[1].area()} %-12s/{zone[2].name} %7.2f/{zone[2].width} %7.2f/{zone[2].height} %7.2f/{zone[2].area()} /{" ".repeat(28)} Total %7.2f/{zone[0].area() + zone[1].area() + zone[2].area()} """;| """| Description Width Height Area| Alfa 17.80 31.40 558.92| Bravo 9.60 12.40 119.04| Charlie 7.10 11.23 79.73| Total 757.69| """
提供了SequencedCollection、SequencedSet、SequencedMap。關系如下:
通過擴展 ZGC 來為新對象和舊對象維護不同的代,從而提高應用程序性能。年輕的對象往往會早逝;維護不同的代將允許 ZGC 更頻繁地收集年輕對象。使用分代 ZGC 運行的應用程序具有以下優勢:分配停頓的風險較低,所需的堆內存開銷較低,并且垃圾收集 CPU 開銷較低。與非分代 ZGC 相比,這些好處應該是可以實現的,而不會顯著降低吞吐量。
使用記錄模式增強 Java 編程語言以解構記錄值。記錄模式和類型模式可以嵌套,以實現強大的、聲明性的、可組合形式的數據導航和處理。
示例:
// Java 16record Point(int x, int y) {}static void printSum(Object obj) { if (obj instanceof Point p) { int x = p.x(); int y = p.y(); System.out.println(x+y); }}// Java 21static void printSum(Object obj) { if (obj instanceof Point(int x, int y)) { System.out.println(x+y); }}
switch 通過表達式和語句的模式匹配增強 Java 編程語言。擴展模式匹配switch允許針對多個模式測試表達式,每個模式都有一個特定的操作,以便可以簡潔、安全地表達復雜的面向數據的查詢。
示例:
static String formatterPatternSwitch(Object obj) { return switch (obj) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> obj.toString(); };}
static void testFooBarNew(String s) { switch (s) { case null -> System.out.println("Oops"); case "Foo", "Bar" -> System.out.println("Great"); default -> System.out.println("Ok"); }}
通過高效地調用外部函數并安全地訪問外部內存,該 API 使 Java 程序能夠調用本機庫并處理本機數據,而沒有 JNI(Java 本機接口)的脆弱性和危險性。該 API 之前已在JDK 20 和JDK 19中預覽。JDK 21 預覽版中的改進包括增強的布局路徑,其中包含用于取消引用地址布局的新元素。
使用未命名模式和未命名變量(可以初始化但不能使用)增強 Java 語言,未命名模式匹配記錄組件而不說明組件的名稱或類型。兩者都由下劃線字符 表示_。
未命名模式示例:
a instanceof Point(_, int y)
未命名的模式變量:
r instanceof Point _r instanceof ColoredPoint(Point(int x, int _), Color _)
虛擬線程是輕量級線程,可以顯著減少編寫、維護和觀察高吞吐量并發應用程序的工作量。
創建虛擬線程示例:
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { IntStream.range(0, 10_000).forEach(i -> { executor.submit(() -> { Thread.sleep(Duration.ofSeconds(1)); return i; }); });}
核心目的是幫助教學和學習。
以后寫 main 方法就變得簡單了,不需要一堆的修飾符。如下:
class HelloWorld { void main() { System.out.println("Hello, World!"); }}
甚至可以不需要類聲明,代碼削減:
void main() { System.out.println("Hello, World!");}
說明:未命名包中的類不能被命名包中的類顯式引用。
將支持在線程內和線程間共享不可變數據。它們優于線程局部變量,特別是在使用大量虛擬線程時。線程局部變量具有設計缺陷,包括無約束的可變性、無限制的生命周期和昂貴的繼承。作用域值允許在大型程序中的組件之間安全地共享數據,而無需求助于方法參數。
引入 API 來表達向量計算,在運行時可靠地編譯為支持的 CPU 架構上的最佳向量指令,從而實現優于同等標量計算的性能。
目標是在未來版本中刪除該端口,原因是最后一個支持 32 位操作的 Windows 操作系統 Windows 10 將于 2025 年 10 月結束生命周期。
在 JDK 21 中,計劃要求動態加載代理必須得到應用程序所有者的批準,就像代理啟動時加載所要求的那樣。此更改將使 Java 平臺更接近默認完整性。
該提案的目標之一是使應用程序能夠使用 KEM 算法,例如 RSA 密鑰封裝機制 (RSA-KEM)、橢圓曲線集成加密方案 (ECIES) 以及美國國家標準與技術研究院 (NIST) 的候選算法后量子密碼學標準化過程。另一個目標是允許在傳輸層安全 (TLS) 等更高級別協議和混合公鑰加密 (HPKE) 等加密方案中使用 KEM。安全提供商將能夠以 Java 代碼或本機代碼實現 KEM 算法,并包括RFC 9180中定義的 Diffie-Hellman KEM (DHKEM) 的實現。
通過結構化并發 API 簡化了并發編程,將在不同線程中運行的相關任務組視為單個工作單元。這簡化了錯誤處理和取消,提高了可靠性并增強了可觀察性。結構化并發之前在JDK 20和JDK 19中孵化,分別于 2022 年 3 月和 2022 年 9 月發布;它將作為java.util.concurrent包中的預覽 API。這次唯一顯著的變化是該StructuredTaskScope::Fork(…)方法返回 Subtask而不是 Future。結構化并發的目標包括推廣一種并發編程風格,可以消除因取消和關閉而產生的常見風險,例如線程泄漏和取消延遲,以及提高并發代碼的可觀察性。
本文鏈接:http://www.tebozhan.com/showinfo-26-10896-0.htmlJava 21正式發布,15大特性一覽
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 用 Rust 編碼?這是 JetBrains 的新 IDE
下一篇: 這種方法可以解決開發中的重復“造輪子”