Java 19 新功能介紹

點贊再看,動力無限 。微信搜「程序猿阿朗」 。
本文 Github.com/niumoo/JavaNotes 和 未讀代碼博客 已經收錄,有很多知識點和系列文章 。

Java 19 新功能介紹

文章插圖
Java 19 在2022 年 9 月 20 日正式發布 , Java 19 不是一個長期支持版本,直到 2023 年 3 月它將被 JDK 20 取代,這次更新共帶來 7 個新功能 。
?bin ./java -versionopenjdk version "19" 2022-09-20OpenJDK Runtime Environment (build 19+36-2238)OpenJDK 64-Bit Server VM (build 19+36-2238, mixed mode, sharing)OpenJDK Java 19 下載:https://jdk.java.net/19/
OpenJDK Java 19 文檔:https://openjdk.java.net/projects/jdk/19/
Java 19 帶來的 7 個新特性:
JEP描述405Record 模式匹配 (Preview)425虛擬線程 (預覽)427Switch 模式匹配 (三次預覽)422Linux/RISC-V Port426Vector API (四次孵化)424外部函數 & 內存 API (Preview)428Structured Concurrency (Incubator)
Java 19 新功能介紹是 Java 新特性系列文章中的一部分 。
系列詳情可以瀏覽:https://www.wdbyte.com/java-feature/
JEP 405: Record 模式匹配(預覽)【Java 19 新功能介紹】record 是一種全新的類型,它本質上是一個 final 類,同時所有的屬性都是 final 修飾,它會自動編譯出 public get hashcode 、equals、toString 等方法,減少了代碼編寫量 。Record 在 Java 14 中被提出,在 Java 15 中二次預覽,在 Java 16 中正式發布 。
示例:編寫一個 Dog record 類,定義 name 和 age 屬性 。
package com.wdbyte;public record Dog(String name, Integer age) {}Record 的使用 。
package com.wdbyte;public class Java14Record {public static void main(String[] args) {Dog dog1 = new Dog("牧羊犬", 1);Dog dog2 = new Dog("田園犬", 2);Dog dog3 = new Dog("哈士奇", 3);System.out.println(dog1);System.out.println(dog2);System.out.println(dog3);}}輸出結果:
Dog[name=牧羊犬, age=1]Dog[name=田園犬, age=2]Dog[name=哈士奇, age=3]在 Java 19 中,為 Record 帶來了增強的模式匹配,在使用 instanceof 后,可以進行類型轉換 。
public class RecordTest {public static void main(String[] args) {Object dog1 = new Dog("牧羊犬", 1);if(dog1 instanceof Dog dogTemp){System.out.println(dogTemp.name());}}}record Dog( String name, Integer age ){}// ?bin ./javaRecordTest.java// 牧羊犬甚至可以在使用 instanceof 時直接得到 Record 中的變量引用 。
public class RecordTest2 {public static void main(String[] args) {Object dog1 = new Dog("牧羊犬", 1);if(dog1 instanceof Dog(String name,Integer age)){System.out.println(name+":"+age);}}}record Dog( String name, Integer age ){}//?bin ./java --enable-preview --source 19 RecordTest2.java//注: RecordTest2.java 使用 Java SE 19 的預覽功能 。//注: 有關詳細信息,請使用 -Xlint:preview 重新編譯 。//牧羊犬:1
擴展:
Java 14 instanceof 類型推斷
Java 16 Record 介紹
JEP 425: 虛擬線程 (預覽)很實用的一個新特性,從 Java 19 開始逐步的引入虛擬線程,虛擬線程是輕量級的線程,可以在顯著的減少代碼的編寫,提高可維護性的同時提高系統的吞吐量 。
引入的原因一直以來 , 在 Java 并發編程中 , Thread 都是十分重要的一部分,Thread 是 Java 中的并發單元,每個 Thread 線程都提供了一個堆棧來存儲局部變量和方法調用,以及線程上下文等相關信息 。
但問題是線程和進程一樣,都是一項昂貴的資源 , JDK 將 Thread 線程實現為操作系統線程的包裝器,也就是說成本很高,而且數量有限 。也因此我們會使用線程池來管理線程,同時限制線程的數量 。比如常用的 Tomcat 會為每次請求單獨使用一個線程進行請求處理 , 同時限制處理請求的線程數量以防止線程過多而崩潰;這很有可能在 CPU 或網絡連接沒有耗盡之前,線程數量已經耗盡,從而限制了 web 服務的吞吐量 。
看到這里你可能要說了,可以放棄請求和線程一一對應的方式啊 , 使用異步編程來解決這個問題,把請求處理分段,在組合成順序管道,通過一套 API 進行管理 , 這樣就可以使用有限的線程來處理超過線程數量的請求 。這當然也是可以的,但是隨之而來的問題是: