JDK17 新特性跟學梳理

JDK17 新特性跟學梳理

  • JDK17 背景介紹
  • 一、JDK 17對Switch語句的增強
  • 二、字符串拼接
  • 三、強制轉換
  • 四、密封類Sealed Classes
  • 五、Record類
  • 六、優化空指針異常信息
  • 七、ZGC垃圾收集器
  • 八、JVM常量API
  • 九、重寫Socket底層API
  • 十、JDK飛行記錄事件流
  • 十一、EdDSA簽名算法
  • 十二、隱藏類
  • 十三、對Value-Based類型的警告
  • 十四、統一的PRNG接口(Enhanced Pseudo-Random Number Generators)
  • 十五、特定于上下文的反序列化過濾器
  • 十五、恢復始終嚴格的浮點語義

JDK17 背景介紹

  • 關注版本:LTS(Long-Term Support 長期支持
  • 目前主流版本
    在這里插入圖片描述
  • 主要應用
    • Spring FrameWork 6.X 要求最低JDK17版本
    • SpringBoot 3.0要求最低JDK17版本
    • Kafka 3.00表示不再支持JDK8
    • Jenkins在最新的2.357版本發表聲明最低支持JDK11

一、JDK 17對Switch語句的增強

JDK 17支持多case同返回值的便捷書寫,以及yield關鍵字返回變量返回值

代碼示例:

public class Main {public static void main(String[] args) {// JDK 8switchOld();// JDK 12switchNew();// JDK 17switchNewer();}/*** 功能描述: JDK 8 的Switch語句** @param* @return void* @date 2025/7/28 22:52* @author Derrick**/public static void switchOld() {String name = "徐庶";String alias = "";switch (name) {case "周瑜":alias = "公瑾";break;case "徐庶":alias = "元直";break;case "項羽":alias = "西楚霸王";break;case "張三":case "李四":alias = "王五";break;case "小米su7":case "小米yu7":alias = "小米智能車";System.out.println("小米智能車");break;}System.out.println("JDK8 alias:" + alias);}/*** 功能描述: JDK 12 的Switch語句** @param* @return void* @date 2025/7/28 22:52* @author Derrick**/public static void switchNew() {String name = "徐庶";String alias = switch (name) {case "周瑜" -> "公瑾";case "徐庶" -> "元直";case "項羽" -> "西楚霸王";default -> throw new IllegalStateException("Unexpected value: " + name);};System.out.println("JDK17 alias:" + alias);}/*** 功能描述: JDK 17 的Switch語句** @param* @return void* @date 2025/7/28 22:57* @author Derrick**/public static void switchNewer() {String name = "小米su7";String alias = switch (name) {case "周瑜" -> "公瑾";case "徐庶" -> "元直";case "項羽" -> "西楚霸王";// JDK 17版本新特性case "張三", "李四" -> "王五";case "小米su7", "小米yu7" -> {System.out.println("小米智能車");// yield關鍵字作為變量的返回值yield "小米智能車";}default -> throw new IllegalStateException("Unexpected value: " + name);};System.out.println("JDK17 alias:" + alias);}
}

二、字符串拼接

JDK 17中
\是置于末尾,作用是將2行轉為1行
\s是單個空白字符

package com.itheima.methods;/*** @ClassName: StringWay* @Description:* @Author: Derrick* @Date: 2025/7/28*/public class StringWay {private String oldStr = "<html>\n" +"<body>\n" +"<h1>Hello, World!</h1>\n" +"<body>\n" +"</html>\n";private String newStr = """<html><body><h1>Hello, World!</h1></body></html>""";// JDK 17中\是置于末尾,作用:將2行轉為1行   \s是單個空白字符private String newerStr = """<html>\<b\sody><h1>Hello, World!</h1></body></html>""";public StringWay() {System.out.println("JDK 8" + dealWithStringOld(oldStr));System.out.println("JDK 15" + dealWithStringOld(newStr));System.out.println("JDK 17" + dealWithStringOld(newerStr));}public String dealWithStringOld(String oldStr) {return oldStr;}
}

控制臺打印效果

JDK 8<html>
<body>
<h1>Hello, World!</h1>
<body>
</html>JDK 15<html><body><h1>Hello, World!</h1></body>
</html>JDK 17<html>    <b ody><h1>Hello, World!</h1></body>
</html>

三、強制轉換

JDK 17可以便捷書寫包裝類的強制類型轉換
package com.itheima.methods;/*** @ClassName: ChangeInstance* @Description:* @Author: Derrick* @Date: 2025/7/28*/public class ChangeInstance {public ChangeInstance() {oldInstance(1);newInstance("對");}/*** 功能描述: JDK 8中需要強制轉換對應類型** @param* @param o* @return void* @date 2025/7/28 23:27* @author Derrick**/public void oldInstance(Object o) {if (o instanceof Integer) {Integer i = (Integer) o;System.out.println(i.intValue());} else if (o instanceof String) {String s = (String) o;System.out.println(s.charAt(0));}}/*** 功能描述: JDK 14中優化** @param* @param o* @return void* @date 2025/7/28 23:28* @author Derrick**/public void newInstance(Object o) {if (o instanceof Integer i) {System.out.println(i.intValue());} else if (o instanceof String s) {System.out.println(s.charAt(0));}}
}

打印效果如下:

1

四、密封類Sealed Classes

permits關鍵字,限制只有子類才能繼承父類。
子類必須使用non-sealed或者final關鍵字,final表示不能再被子子類繼承,non-sealed表示能被子子類繼承。
密封類和子類必須同處于一個包下,如果不在一個包下,就會報錯。
子類必須直接繼承自密封類,不能間接繼承,否則會報錯。
密封類的好處:(1)密封類更加安全,可以限制子子類的繼承 (2).密封類更加可控,減少代碼復雜性,易于維護

密封類代碼示例:

package com.itheima.methods;/*** @ClassName: SealedTest* @Description: permits關鍵字,限制只有SealedSon才能繼承SealedFather類* @Author: Derrick* @Date: 2025/7/29*/public abstract sealed class SealedFather permits SealedSon {}

子類代碼示例

package com.itheima.methods;/*** @ClassName: SealedSon* @Description: 子類必須使用non-sealed或者final關鍵字* @Author: Derrick* @Date: 2025/7/29*/public non-sealed class SealedSon extends SealedFather {
}

五、Record類

類似lombok的屬性只讀對象

IDEA創建class的時候選擇Record
在這里插入圖片描述
Record示例如下:

package com.itheima.methods;/*** @RecordName: UserRecord* @Description:* @Author: Derrick* @Date: 2025/7/29*/
public record UserRecord(Long id, String userName) {
}

編譯的.class字節碼文件如下:

package com.itheima.methods;public record UserRecord(Long id, String userName) {public UserRecord(Long id, String userName) {this.id = id;this.userName = userName;}public Long id() {return this.id;}public String userName() {return this.userName;}
}

Main函數

import com.itheima.methods.ChangeInstance;
import com.itheima.methods.StringWay;
import com.itheima.methods.UserRecord;public class Main {public static void main(String[] args) {// RecordUserRecord userRecordOne = new UserRecord(1L, "Lily");UserRecord userRecordTwo = new UserRecord(1L, "Lily");System.out.println("userRecordOne.name:" + userRecordOne.userName());System.out.println("userRecordOne:" + userRecordOne);System.out.println("userRecordTwo.name:" + userRecordTwo.userName());System.out.println("userRecordTwo:" + userRecordTwo);System.out.println(userRecordOne.equals(userRecordTwo));}
}

控制臺打印

userRecordOne.name:Lily
userRecordOne:UserRecord[id=1, userName=Lily]
userRecordTwo.name:Lily
userRecordTwo:UserRecord[id=1, userName=Lily]
true

這里可以看到Record對象的屬性值相同,就是一個對象
在這里插入圖片描述

六、優化空指針異常信息

這個改動是JDK 14的,這里特別講解一下

可以便捷查看空指針異常出自哪一句代碼的哪個對象為null

代碼示例

public static void main(String[] args) {// 解決空指針String str = null;int length = str.length();System.out.println("字符串長度:" + length);}

控制臺打印

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is nullat Main.main(Main.java:34)

可以看到JDK14針對哪個對象空指針是有說明的

七、ZGC垃圾收集器

JDK11誕生,JDK15正式使用,JDK17已經很成熟
優點:垃圾回收不卡頓(stop the world少于10ms),Java開發不用愁

在這里插入圖片描述
可以看到JDK17的垃圾回收期性能最優
在這里插入圖片描述
使用方式,配置如下即可,因為JDK11和JDK17默認的垃圾回收期是G1

-XX:+UseZGC

八、JVM常量API

在這里插入圖片描述
比如String的源碼,獲取字符串常量的描述describeConstable,設置字符串常量的描述resolveConstantDesc

    /*** Returns an {@link Optional} containing the nominal descriptor for this* instance, which is the instance itself.** @return an {@link Optional} describing the {@linkplain String} instance* @since 12*/@Overridepublic Optional<String> describeConstable() {return Optional.of(this);}/*** Resolves this instance as a {@link ConstantDesc}, the result of which is* the instance itself.** @param lookup ignored* @return the {@linkplain String} instance* @since 12*/@Overridepublic String resolveConstantDesc(MethodHandles.Lookup lookup) {return this;}

九、重寫Socket底層API

在這里插入圖片描述
源碼如下

public abstract class SocketImpl implements SocketOptions {private static final boolean USE_PLAINSOCKETIMPL = usePlainSocketImpl();private static boolean usePlainSocketImpl() {PrivilegedAction<String> pa = () -> NetProperties.get("jdk.net.usePlainSocketImpl");@SuppressWarnings("removal")String s = AccessController.doPrivileged(pa);return (s != null) && !s.equalsIgnoreCase("false");}/*** Creates an instance of platform's SocketImpl*/@SuppressWarnings("unchecked")static <S extends SocketImpl & PlatformSocketImpl> S createPlatformSocketImpl(boolean server) {if (USE_PLAINSOCKETIMPL) {return (S) new PlainSocketImpl(server);} else {return (S) new NioSocketImpl(server);}}
}

十、JDK飛行記錄事件流

在這里插入圖片描述

比如Spring Boot中Spring Boot Actuator模塊可以啟動記錄JFR記錄,可以通過在應用程序的配置文件中設置一下屬性來啟用JFR記錄
在這里插入圖片描述

十一、EdDSA簽名算法

了解即可
在這里插入圖片描述

十二、隱藏類

在這里插入圖片描述

在這里插入圖片描述

十三、對Value-Based類型的警告

在這里插入圖片描述

十四、統一的PRNG接口(Enhanced Pseudo-Random Number Generators)

在這里插入圖片描述

十五、特定于上下文的反序列化過濾器

在這里插入圖片描述

十五、恢復始終嚴格的浮點語義

在這里插入圖片描述

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

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

相關文章

ESP8266 AT 固件

ESP-12E 是一種常見的 ESP8266 模塊&#xff0c;通常帶有 4MB&#xff08;32Mbit&#xff09;閃存&#xff0c;非常適合刷寫 最新版 AT 固件。 ? 適用于 ESP?12E 的 AT 固件推薦 固件來源固件版本特點Espressif 官方v2.2.1.0 (ESP8266 IDF AT)官方最新版&#xff0c;基于 RT…

Node.js(三)之Express

Express 目錄 Express 九、初識Express 9.1 Express簡介 1. 什么是 Express 2. 進一步理解Express 3. Express能做什么 9.2 Express的基本使用 1. 安裝 2. 創建基本的Web服務器 3. 監聽GET請求 4. 監聽POST請求 5. 把內容響應給客戶端 6. 獲取URL中攜帶的查詢參數…

IKAnalyzer分詞插件使用方法

前言 隨著越來越多的大數據網站崛起&#xff0c;特別是一些私人網站都提供了站內搜索&#xff0c;有些人會用elastsearch來實現站內搜索的目的&#xff0c;但是一些小站并沒有那么大的數據提供搜索&#xff0c;在安裝一個 elastsearch 服務未免有點浪費&#xff1f; 因此&#…

ESB 在零售,物流,制造,保險,醫療行業的應用方式

企業服務總線&#xff08;Enterprise Service Bus, ESB&#xff09;是一種基于中間件的集成模式&#xff0c;用于實現不同系統之間的集成與通信。ESB通過標準化接口、消息路由、協議轉換和數據轉換等功能&#xff0c;幫助企業實現系統間的無縫對接&#xff0c;提高業務敏捷性。…

vcsa6.7-重置root密碼

客戶反饋vc無法登錄了&#xff0c;登錄環境一看&#xff0c;報錯如下首先想到是證書到期了&#xff0c;瀏覽器確認&#xff0c;確實是證書到期了準備ssh登錄才發現root密碼忘記了&#xff0c;那就先重置root密碼&#xff0c;1、登錄esxi主機找到vcsa6.7機器關機做快照2、開機到…

C++ 賦值與交換法則

在C中&#xff0c;賦值與交換法則&#xff08;Assignment and Swap Idiom&#xff09;通常指的是在實現類的賦值操作符&#xff08;operator&#xff09;時&#xff0c;結合拷貝構造和交換操作來確保強異常安全保證&#xff08;Strong Exception Safety Guarantee&#xff09;的…

Ambari中文漢化

Ambari-ZH 當前Ambari的漢化版本為2.7.4,漢化采用對該版本的ambari源碼直接修改的方式進行,如有翻譯不當之處,請批評指正 一、使用方法如下&#xff1a; 方式一&#xff1a;直接下載 下載地址&#xff1a;https://github.com/ukayunnuo/Ambari-2.7.x-zh/releases/download/…

表格之固定列和表頭

說明 利用粘性定位實現 列固定 td.fixed {position: sticky;left: 0;z-index: 5;/* 最好指定背景&#xff0c;否則滑動時會顯示下面的列 */background-color: #f8f9fa; }表頭固定 <head><style>.table-container {position: relative;display: flex;overflow: hidd…

React 圖標庫發布到 npm 倉庫

將搭建的 React 圖標庫發布到 npm 倉庫需要經過一系列步驟&#xff0c;包括配置 package.json、構建代碼、注冊 npm 賬號、測試和發布。以下是詳細流程&#xff1a; 1. 準備工作 (1) 確保項目結構完整 圖標庫的典型結構&#xff08;以 Rollup 構建為例&#xff09;&#xff1…

Java學習第八十四部分——HttpClient

目錄 一、前言介紹 二、主要特點 三、功能用法 四、應用場景 五、最佳實踐 六、總結歸納 一、前言介紹 HttpClient 是一個用于發送 HTTP 請求和接收 HTTP 響應的客戶端庫&#xff0c;廣泛應用于 Web 開發、API 調用、微服務通信等場景。 二、主要特點 支持多種HTTP方…

學習筆記-中華心法問答系統的性能提升

1.簡介本周主要任務是自行查找文獻&#xff0c;針對源代碼進行性能提升&#xff0c;主要包括三個方面&#xff1a;預處理&#xff1a;分詞、關鍵詞提取、詞向量生成&#xff1b;文本分析&#xff1a;從多個關鍵詞的詞向量&#xff0c;如何到一句話的語義理解&#xff1b;問題分…

Python爬蟲03_Requests破解百度翻譯

爬取百度翻譯頁面信息 以POST方法發送JSON數據&#xff0c;爬取響應信息&#xff0c;并且需要對響應信息對象類型進行區分。 import requests import json#1.指定url post_url https://fanyi.baidu.com/sug#2.進行UA封裝 headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; …

【C++進階】第8課—紅黑樹封裝map和set

文章目錄1. map和set的源碼及框架分析2. 模擬實現map和set2.1 實現可以復用紅黑樹的框架&#xff0c;支持insert操作2.2 實現迭代器iterator2.2.1 實現迭代器2.2.2 實現迭代器 - -2.2.3 解決key不能修改的問題2.2.4 重載operator[ ]3. 完整代碼3.1 紅黑樹頭文件RBTree.h3.2 mym…

【機器學習深度學習】DeepSpeed框架:高效分布式訓練的開源利器

目錄 前言 一、DeepSpeed 簡介 1.1 定位與目標 1.2 集成生態 二、核心技術解析 2.1 ZeRO&#xff08;Zero Redundancy Optimizer&#xff09; 2.2 顯存優化技術 2.3 推理優化與通信機制 三、DeepSpeed 的優勢與特性總結 四、 典型應用場景 &#x1f9e0; 大模型訓練…

從視覺到現實:掌握計算機視覺技術學習路線的十大步驟

成長路上不孤單&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;【14后&#x1f60a;///計算機愛好者&#x1f60a;///持續分享所學&#x1f60a;///如有需要歡迎收藏轉發///&#x1f60a;】今日分享關于計算機視覺技術學習路線方面的相關內容…

DeepSeek MoE 技術解析:模型架構、通信優化與負載均衡

1. MoE 簡介 MoE&#xff08;Mixed Expert Models&#xff09;&#xff0c;混合專家模型。在 Transformer 的 FFN 中&#xff0c;有一個重要的觀察是&#xff0c;其計算過程中的神經元激活是非常稀疏的&#xff0c;在一次計算中只有 90%的輸入激活不到 5%的神經元&#xff0c;…

【Linux】pthread學習筆記

1. 線程基礎(1) 線程創建與終止#include <pthread.h> // 創建線程 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg); // 終止當前線程 void pthread_exit(void *retval); // 等待線程結束 int pthread_joi…

p5.js 從零開始創建 3D 模型,createModel入門指南

點贊 關注 收藏 學會了 如果你已經開始探索 p5.js 的 3D 世界&#xff0c;那么createModel()這個 API 絕對是你需要掌握的強大工具。它允許你創建自定義的 3D 幾何模型&#xff0c;為你的創意提供無限可能。 什么是 createModel ()&#xff1f; createModel() 用于從一個…

react 的 useTransition 、useDeferredValue

useTransition 用于 管理狀態更新的過渡&#xff08;pending&#xff09;狀態&#xff0c;避免因高優先級任務&#xff08;如用戶輸入&#xff09;被低優先級任務&#xff08;如數據獲取或復雜計算&#xff09;阻塞而導致的界面卡頓。 它特別適用于&#xff0c;需要 區分緊急更…

Unity的GameObject.Instantiate的使用

在Unity游戲引擎中&#xff0c;GameObject.Instantiate 是一個核心方法&#xff0c;用于在運行時動態創建游戲對象的副本。它常用于實例化預制體&#xff08;Prefab&#xff09;&#xff0c;例如生成敵人、子彈或場景元素。以下是其使用方法的詳細說明&#xff0c;包括語法、參…