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;包括语法、参…