Java 17 新特性筆記

Java 17 是一個 長期支持版本(LTS),于 2021 年 9 月發布,是繼 Java 11 之后的重要里程碑。它整合了 Java 12~16 的眾多特性,并引入新的語言增強、JDK API 改進、性能優化和安全增強。


Java 17 版本信息

  • 發布時間:2021 年 9 月
  • 類型:LTS(長期支持)
  • 前一個 LTS:Java 11
  • JDK 編號:JEP 306~JEP 412 等
  • 官網文檔:https://openjdk.org/projects/jdk/17/

一、語言特性增強

1. 封閉類(Sealed Classes)】

作用

限制哪些類可以繼承某個類,提升安全性和建模能力。

使用方式
public sealed class Shapepermits Circle, Rectangle, Square {}final class Circle extends Shape {}
final class Rectangle extends Shape {}
final class Square extends Shape {}
修飾符說明
  • sealed:定義封閉類
  • permits:指定允許的子類
  • 子類必須是 finalsealednon-sealed

2. Switch 增強(Pattern Matching for switch 的預覽)

Java 17 引入了對 switch 語句匹配模式的預覽支持,允許對類型進行更靈活的判斷。

static String formatter(Object o) {return switch (o) {case Integer i -> "Integer: " + i;case Long l    -> "Long: " + l;case String s  -> "String: " + s.toUpperCase();default        -> "Unknown";};
}

3. instanceof 模式匹配(正式)

instanceof 和強制類型轉換整合為一種簡潔語法。

Java 11 寫法:
if (obj instanceof String) {String s = (String) obj;System.out.println(s.length());
}
Java 17 寫法:
if (obj instanceof String s) {System.out.println(s.length());
}

二、JDK API 改進

1. 強封裝 JDK 內部 API

說明:

移除了對大部分 sun.miscjdk.internal.* 等內部包的默認訪問。

目的:提升模塊安全
影響:舊項目需改為使用標準 API 或反射白名單處理。


2. 新的 RandomGenerator 接口

引入統一的隨機數生成框架,支持多種算法。

RandomGenerator gen = RandomGenerator.of("L64X256MixRandom");
int val = gen.nextInt();

新增類包括:

  • RandomGenerator
  • RandomGeneratorFactory
  • SplittableRandom
  • Xoroshiro128PlusPlus

3. Foreign Function & Memory API(孵化)

用于調用本地函數(如 C 語言庫)并安全地操作內存。

取代 JNI 更安全、易用:

MemorySegment segment = MemorySegment.allocateNative(100, ResourceScope.newConfinedScope());

4. Vector API(孵化)

支持 SIMD 矢量計算,提高性能。

用途:圖像處理、機器學習、大數據運算等。


5. Deprecate and Remove RMI Activation

廢棄并移除過時的 RMI 激活機制,鼓勵使用現代 RPC 框架。


三、已刪除的舊特性

刪除內容說明
Applet APIApplet 被徹底移除
RMI Activation過時,已廢棄
Experimental AOT 和 JIT Compiler移除 Graal 編譯器的實驗支持
Security Manager計劃在未來版本中移除,當前已被棄用(JEP 411)

四、JVM 與性能改進

1. ZGC 和 Shenandoah 正式穩定

  • ZGC(低延遲 GC)和 Shenandoah 垃圾回收器現已正式穩定。

  • 使用方式:

    java -XX:+UseZGC MyApp
    java -XX:+UseShenandoahGC MyApp
    

五、跨版本特性整合(Java 12~16)

Java 17 還包含了前幾個版本中引入的重要功能:

版本特性
Java 12Switch 表達式(預覽)
Java 14Record 類(預覽)
Java 15Text Blocks 正式推出
Java 16RecordPattern Matching 的改進
Java 17將部分預覽特性正式化

總結

特性狀態說明
封閉類(Sealed Classes)正式增強類型控制
instanceof 模式匹配正式簡化類型檢查
switch 模式匹配預覽更靈活的分支
新 Random API正式更豐富的隨機算法
Foreign Memory API孵化高效替代 JNI
Vector API孵化支持 SIMD 運算
Applet 移除刪除不再支持 Applet
RMI 激活移除刪除不推薦使用 RMI
安全管理器棄用棄用將被完全移除

參考資料

  • OpenJDK JEPs
  • Oracle Java 17 Release Notes

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913810.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WWDC 25 風云再起:SwiftUI 7 Charts 心法從 2D 到 3D 的華麗蛻變

概述 在 iOS 開發這個波譎云詭的江湖中,SwiftUI 可謂是一位后起之秀,以其簡潔明快的招式迅速在 UI 框架領域中嶄露頭角。 而其中的 Charts 框架,更是如同江湖中的 “數據可視化寶典”那樣,讓各位禿頭少俠們能夠輕松將復雜的數據轉…

Vue+Element Plus 中按回車刷新頁面問題排查與解決

VueElement Plus 中按回車刷新頁面問題排查與解決原因分析解決方案方法一:阻止默認行為 submit.prevent方法二:只監聽回車并觸發搜索最終推薦寫法如下:在使用 Vue 3 Element Plus 開發后臺系統時,我們常常會通過 搭配 實現搜索功…

x86匯編語言入門基礎(三)匯編指令篇3 位移運算

位移運算指令:SHL邏輯移位,SAR算術移位, ROR循環右移 1. SHL 邏輯移位 Shift Left, SHL代表向左移位,SHR代表向右移位 指令格式:shl op1, op2 目的操作數 op1:寄存器/內存地址源操作數 op2:寄…

Java-69 深入淺出 RPC 單體架構 垂直架構 分布式架構 微服務架構

點一下關注吧!!!非常感謝!!持續更新!!! 🚀 AI篇持續更新中!(長期更新) AI煉丹日志-29 - 字節跳動 DeerFlow 深度研究框斜體樣式架 私有…

Android 如何阻止應用自升級

問題背景 1.打開PlayStore,然后登陸賬戶 2.退出應用過幾分鐘后,應用會自動更新到新版本 3.再次打開應用,問題即可復現 一聯網進入playStore應用并且登錄谷歌賬號,退出幾分鐘,在進入,發現應用版本號更新了,應用進行了自我升級,關鍵是升級之后谷歌商店就用不了了,就…

Docker-構建鏡像并實現LNMP架構

一、搭建LNMP基礎配置1、制作Nginx鏡像制作dockerfilevim dockerfileFROM centos:7 RUN rm -rf /etc/yum.repos.d/* RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo RUN yum clean all RUN yum makecache RUN yum -y install z…

Python之--基本知識

基本輸出語法結構: print(輸出內容)print()函數完整的語法格出: print (value,...,sep,end\n,fileNone)只有字符串可以用連接基本輸入語法結構: xinput(提示文字’)注意事項: 無論輸入的數據是什么 x 的數據類型都是字符串類型示例:name input("Enter your na…

VS CodeC51 單片機開發環境搭建

文章目錄前言1.安裝插件2.創建EIDE項目(51單片機)3.配置工具鏈(第一次使用需要配置)4.編譯與下載5.項目文件簡介與串口調試工具6.推薦插件7.打包模板與導出模板8.51單片機串口無法識別問題前言 需要安裝keil c51版本需要配置好C/…

國密算法(SM2/SM3/SM4)

文章目錄國密算法(SM2/SM3/SM4)詳解:從性能對比到Java手機號安全處理實戰一、 國密核心算法簡介二、 性能深度對比三、 Java實戰:手機號的安全處理方案一:使用SM3哈希存儲(推薦用于驗證場景)方案…

從前端轉go開發的學習路線

從前端開發轉向 Go(Golang)后端開發,是一個非常可行也很實用的方向,特別是在做 高性能微服務、分布式系統、云原生(如Kubernetes) 等方面。以下是一份適合你(有多年開發經驗的前端開發者&#x…

node或瀏覽器上傳文件到阿里云OSS

阿里云配置 進入阿里云OSS Bucket 列表的某個 Bucket 倉庫下,點擊訪問控制 RAM 創建用戶 勾上 創建 AccessKey ID 和 AccessKey Secret 復制 AccessKey 信息 用文檔保存 創建角色 選擇云賬號 復制 ARN 用文檔保存,然后 新增權限 搜索 oss 選擇 AliyunOSS…

26考研物理復試面試常見問答問題匯總,物理專業保研推免夏令營面試問題匯總,物理本科知識專業面試最全攻略!

還在為物理考研復試面試發愁?還在為物理招聘的專業面試抓狂?還在為即將到來的物理夏令營面試不知從何下手、翻遍了厚厚的教材卻抓不住重點?別慌,接下來我會從「考研的物理復試經歷」「物理面試攻略」「物理面試基礎問答題匯總很全…

(5)機器學習小白入門 YOLOv:數據需求與圖像不足應對策略

(1)機器學習小白入門YOLOv :從概念到實踐 (2)機器學習小白入門 YOLOv:從模塊優化到工程部署 (3)機器學習小白入門 YOLOv: 解鎖圖片分類新技能 (4)機器學習小白入門YOLOv :圖片標注實操手冊 (5)機器學習小白入門 YOLOv:…

百年制造名企,三菱重工引領“智”造新范式

日前,由深圳軟件協會指導、法大大和信息俠聯合出品的《制造行業合同數智化升級白皮書》(以下簡稱“白皮書”)正式發布,并首次提出 “電子簽法律AI” 雙輪驅動模型。在制造行業面臨供應鏈協同、合規風控及全球化出海等多重挑戰的當…

【學習筆記】計算機操作系統(七)—— 文件管理

第七章 文件管理 文章目錄第七章 文件管理7.1 文件和文件系統7.1.1 數據項、記錄和文件7.1.2 文件名和類型7.1.3 文件系統的層次結構7.1.4 文件操作7.2 文件的邏輯結構7.2.1 文件邏輯結構的類型7.2.2 順序文件(Sequential File)7.2.3 記錄尋址7.2.4 索引文件(Index File)7.2.5 …

基于PyQt5與深度學習的可視化水果識別系統(集成CNN, MobileNetV2, VGG16)

一、項目概述 大家好!今天我將分享一個我近期完成的深度學習項目——一個功能強大的、帶圖形化界面(GUI)的水果識別系統。該系統不僅能識別靜態圖片中的水果,還集成了模型訓練、評估、數據增強等功能于一體,為深度學習…

k8s-服務發布基礎

目錄 Service的定義 核心定義 Service 的類型 關鍵組件與機制 工作流程示例 高級特性 Service工作原理 核心工作原理 標簽選擇器(Label Selector) Endpoints 對象 網絡代理與負載均衡(kube-proxy) userspace 模式&#…

洛谷P1514 [NOIP 2010 提高組] 引水入城

洛谷P1514 [NOIP 2010 提高組] 引水入城 洛谷題目傳送門 題目背景 NOIP2010 提高組 T4 題目描述 在一個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成一個 NNN 行 MMM 列的矩形&#xff…

【unity小技巧】國內Unity6下載安裝和一些Unity6新功能使用介紹

文章目錄前言一、安裝1、國外下載2、國內下載二、常用的新功能變化1、官方推薦使用inputsystem進行輸入控制2、修復了InputSystem命名錯誤導致listen被遮擋的bug3、自帶去除unity啟動畫面logo功能4、unity官方的behavior行為樹插件5、linearVelocity代替過時的velocity方法6、隨…

Rust 中字符串類型區別解析

在 Rust 中,"hello" 和 String::from("hello") 都表示字符串,但它們在內存表示、所有權和可變性上有本質區別:1. 類型與內存表示"hello" (字符串字面量):類型為 &str(字符串切片引用…