当前位置: 首页 > news >正文

JDK17常用新特性

目前国内大部分开发人员都是在使用jdk8,甚至是jdk6,但是随着jdk的更新迭代,jdk8我觉得可能就会慢慢的淡出舞台,随着目前主流框架最新版推出明确说明了不再支持jdk8,也促使我不得不抓紧学习了解一波jdk17的新特性,以备不时之需。
所以屏幕前的小伙伴不要觉得这会不会太过遥远,那我这里找一些数据,大家可以参考一下,自己根据需求看看是否自己所在的行业或者是领域有没有在变化
在这里插入图片描述

2023年newRelic统计
另外springframwork6.x,Jenkins3.5,kafka最新版,SpringBoot3.x也停止对jdk8的支持
当然我这里列出这些数据也只是想提醒我们这些技术人,不管用什么,都不要停下脚步。
这里我对jdk17的一些常用的特性在这里学习整理了一下,以便后面需要的时候可以查看回忆

一、Switch增强

以前jdk8的版本,我们写switch是不是发现会很长当我们的条件比较多的时候,而且每一个case后面需要跟上break或者continue,在jdk17里会变得很清爽。
下面我们来看下jdk8和jdk17里switch的写法区别:

public class Demo_Switch {public static void main(String[] args) {String name = "张三";String alias17 = switch (name) {case "张三", "李四" -> "王五";default -> throw new IllegalArgumentException("Unexpected value: " + name);};System.out.println("jdk17写法输出 alias:" + alias17);alias17 = switch (name) {case "张三" -> {System.out.println("内部处理逻辑...");yield "王五";}default -> {throw new IllegalArgumentException("Unexpected value: " + name);}};System.out.println("jdk17写法输出 alias:" + alias17);String alias8 = "";switch(name) {case "张三":case "李四":alias8 = "lisi";System.out.println("jdk8写法输出 alias:" + alias8);break;default:throw new IllegalArgumentException("Unexpected value: " + name);}}}

可以看到上面jdk8的写法需要10行,而jdk17的写法只需要5行代码。

  1. 可以发现匹配多个条件只需要在case后面用逗号分割多个条件即可;
  2. 另外支持采用->的形式作为返回值直接赋值给变量;
  3. 另外移除了break。
  4. 支持采用代码块的形式作为case匹配的执行逻辑编写

二、String字符串拼接增强

jdk17以前我们对字符串的拼接往往好写好多的+,现在jdk17支持使用"""作为字符块来对字符串拼接增强,另外jdk17增加了转义符用于对字符串内需要换行或者空格的支持

  • \:空格
  • \n:换行
public class Demo_String {public static void main(String[] args) {String sql = """SELECT ID,NAME,AGEFROM T_STUDENTWHERE NAME = '%s'""";System.out.println(String.format(sql, "张三"));}}

三、模式匹配instanceof

3.1、模式匹配的原理剖析

  1. 模式匹配 for instanceof 是 Java 17 中引入的一项新特性,它允许在进行instanceof类型检查时,同时进行变量的类型转换,从而使代码更加简洁和直观。
  2. 模式匹配的原理是通过在instanceof操作符后面使用模式来进行类型判断和变量赋值。如果类型判断成功,变量将被自动转换为对应的类型,从而可以直接进行操作,避免了繁琐的类型转换代码。
    下面我们来看下具体是怎么使用的:
    使用模式匹配 for instanceof 可以将传统的instanceof类型检查和类型转换代码简化为一个更加简洁的表达式。例如,
  • 在 Java 17 之前,我们可能会这样写代码
public class Demo_Instanceof {public static void main(String[] args) {Object o = new String("哈哈哈");if (o instanceof String) {String s = (String) o;System.out.println(s);}}
}
  • 在 Java 17 中,我们可以使用模式匹配来简化这段代码:
    Object obj = new String("哈哈哈");if (obj instanceof String str) {System.out.println(str.length());}

四、密封类Sealed Class

4.1、密封类的定义与作用

密封类是 Java 17 中引入的一个新特性,用于限制类的继承结构。通过密封类,开发者可以明确指定哪些类可以继承自一个基类,从而增强了类型系统的安全性和可维护性。
密封类的主要作用是防止意外的类继承,确保类的设计意图得到正确的实现。它可以帮助开发者更好地控制代码的结构和行为,减少潜在的错误和风险。

4.2、密封类及子类的定义方式

  • 要定义一个密封类,需要使用sealed关键字修饰类声明,并指定允许继承的子类列表。例如:
public sealed class Demo_SealedClass permits Demo_SubSealedClass1, Demo_SubSealedClass2 {public void baseMethod() {System.out.println("我是密封父类");}}
  • 子类需要使用non-sealed关键字(如果不是最终类)或final关键字来表明其继承状态。例如:
public non-sealed class Demo_SubSealedClass1 extends Demo_SealedClass {@Overridepublic void baseMethod() {System.out.println("我是密封子类1");}}public final class Demo_SubSealedClass2 extends Demo_SealedClass{@Overridepublic void baseMethod() {System.out.println("我是密封子类2");}}

实际应用场景与优势分析

  1. 当一个类的设计不希望被随意继承或扩展时,可以使用密封类来限制继承结构。
  2. 对于一些框架或库的核心类,为了保证其稳定性和安全性,可以使用密封类来控制类的继承。
    注意:
    1、密封类的父类和子类都必须要在同一个包下
    2、子类必须直接继承密封父类

五、新的垃圾回收器ZGC

5.1、新垃圾回收器的特点与优势

JDK 17 中引入了一种新的垃圾回收器,旨在提高垃圾回收的效率和性能,减少垃圾回收对应用程序性能的影响。
新的垃圾回收器采用了一些先进的技术和算法,如并发标记清除、增量更新等,能够更快速地完成垃圾回收操作,同时减少了垃圾回收过程中的暂停时间,提高了应用程序的响应性和吞吐量。

5.2、性能测试与对比分析

为了评估新垃圾回收器的性能,我们可以进行一些性能测试,并将其与传统的垃圾回收器进行对比分析。例如,我们可以使用一些基准测试工具来测试应用程序在不同垃圾回收器下的性能指标,如吞吐量、暂停时间、内存占用等。
通过对比分析,我们可以发现新垃圾回收器在大多数情况下都能够提供更好的性能表现,特别是在处理大规模数据和高并发场景下,新垃圾回收器的优势更加明显。

    java -XX:+UseZGC MyApplication

可以使用上述的jvm参数配置使得ZGC回收机制生效,垃圾回收机制是JVM不可避免的一种机制,目的就是防止内存溢出,jdk8及以前是通过频繁的触发堆内存的回收机制去释放内存,每一次回收都会触发STW停顿,这就造成了性能的损耗,而解决的办法就是降低停顿或者提高堆内存。jdk17可以将堆内存设置的很大,另外就是可以通过配置ZGC提高内存回收。

相关文章:

JDK17常用新特性

目前国内大部分开发人员都是在使用jdk8,甚至是jdk6,但是随着jdk的更新迭代,jdk8我觉得可能就会慢慢的淡出舞台,随着目前主流框架最新版推出明确说明了不再支持jdk8,也促使我不得不抓紧学习了解一波jdk17的新特性&#…...

【分布式微服务云原生】探索负载均衡的艺术:深入理解与实践指南

探索负载均衡的艺术:深入理解与实践指南 摘要: 在本文中,我们将深入探讨负载均衡的概念、重要性以及实现负载均衡的多种算法。通过详细的技术解析、Java代码示例、流程图和对比表格,您将了解如何选择合适的负载均衡策略来优化资源…...

拥抱云原生

专题七:云原生实战72课时 专题简介: 云原生正在改变世界,新一代架构思想ServiceMesh、Serverless改变传统软件架构模式,本专题基于完全云上架构实战,结合微服务架构和云计算平台两者的优势,属于架构师必备…...

关于使用若依并快速构建系统的操作指南

准备阶段--下载源码(脚手架) 1.1 若依官网地址:https://www.ruoyi.vip/ 1.2 选择“前后端分离版本进行下载”,如下图所示 1.3 跳转gitee后,直接按如下步骤进行下载。 前后端模块分离 解压,并打开到项目…...

【分布式微服务云原生】 选择SOAP还是RESTful API?深入探讨与实践指南

🌐 选择SOAP还是RESTful API?深入探讨与实践指南 摘要: 在构建现代Web服务时,开发者常常面临一个关键决策:是选择SOAP还是RESTful API?本文将为您提供一个全面的比较,包括两者的适用场景、安全…...

HarmonyOS NEXT 应用开发实战(五、页面的生命周期及使用介绍)

HarmonyOS NEXT是华为推出的最新操作系统,arkUI是其提供的用户界面框架。arkUI的页面生命周期管理对于开发者来说非常重要,因为它涉及到页面的创建、显示、隐藏、销毁等各个阶段。以下是arkUI页面生命周期的介绍及使用举例。 页面的生命周期的作用 页面…...

C# 比较两个集合和比较对象

1、比较集合 /// <summary> /// 比较两个集合 /// </summary> /// <typeparam name"T"></typeparam> /// <param name"list1"></param> /// <param name"list2"></param> /// <returns>&…...

Spark高级用法-自定义函数

用户可以根据需求自己封装计算的逻辑&#xff0c;对字段数据进行计算 内置函数&#xff0c;是spark提供的对字段操作的方法 &#xff0c;split(字段) 对字段中的数进行切割&#xff0c;F.sum(字段) 会将该字段下的数据进行求和 实际业务中又能内置函数不满足计算需求&#xff0…...

『Mysql进阶』Mysql explain详解(五)

目录 Explain 介绍 Explain分析示例 explain中的列 1. id 列 2. select_type 列 3. table 列 4. partitions 列 5. type 列 6. possible_keys 列 7. key 列 8. key_len 列 9. ref 列 10. rows 列 11. filtered 列 12. Extra 列 Explain 介绍 EXPLAIN 语句提供有…...

【工具】音视频翻译工具基于Whisper+ChatGPT

OpenAI推出的开源语音识别工具Whisper&#xff0c;以其卓越的语音识别能力&#xff0c;在音频和视频文件处理领域大放异彩。与此同时&#xff0c;ChatGPT也在翻译领域崭露头角&#xff0c;其强大的翻译能力备受赞誉。因此&#xff0c;一些字幕制作团队敏锐地捕捉到了这两者的结…...

学成在线——关于nacos配置优先级的坑

出错&#xff1a; 本地要起两个微服务&#xff0c;一个是content-api&#xff0c;另一个是gateway网关服务。 发现通过网关服务请求content微服务时&#xff0c;怎么请求都请求不到。 配置如下&#xff1a; content-api-dev.yaml的配置&#xff1a; server:servlet:context-p…...

Nginx在Windows Server下的启动脚本

Nginx在Windows Server下的快捷运行脚本 使用时记得修改NGINX_DIR路径 ECHO OFF CHCP 65001 SET NGINX_DIRD:\software\Nginx\ color 0a TITLE Nginx Management GOTO MENU :MENU CLS ECHO. ECHO. * * * * Nginx Management * * * * * * * * * * * ECHO. * * EC…...

【国科大】C++程序设计秋季——五子棋

【国科大】C程序设计秋季 —— 五子棋程序 下载地址&#xff1a;https://mbd.pub/o/bread/Zp2Ukptx...

Docker 环境下多节点服务器监控实战:从 Prometheus 到 Grafana 的完整部署指南

Docker 环境下多节点服务器监控实战&#xff1a;从 Prometheus 到 Grafana 的完整部署指南 文章目录 Docker 环境下多节点服务器监控实战&#xff1a;从 Prometheus 到 Grafana 的完整部署指南一 多节点部署1 节点一2 节点二3 节点三 二 监控节点部署三 配置 prometheus.yml四 …...

【动手学深度学习】6.3 填充与步幅(个人向笔记)

卷积的输出形状取决于输入形状和卷积核的形状在应用连续的卷积后&#xff0c;我们最终得到的输出大小远小于输入大小&#xff0c;这是由于卷积核的宽度和高度通常大于1导致的比如&#xff0c;一个 240 240 240240 240240像素的图像&#xff0c;经过10层 5 5 55 55的卷积后&am…...

【宝可梦】游戏

pokemmo https://pokemmo.com/zh/ 写在最后&#xff1a;若本文章对您有帮助&#xff0c;请点个赞啦 ٩(๑•̀ω•́๑)۶...

docker启动的rabbitmq如何启动其SSL功能

docker run --hostname my-rabbit --name my-rabbit -p 5671:5671 -p 15671:15671 -p 15672:15672 -e RABBITMQ_DEFAULT_USERabc -e RABBITMQ_DEFAULT_PASSabc -d rabbitmq:4.0-management 使用docker的复制命令将ca.crt、server.crt和server.key文件复制到容器的/etc/server_s…...

易基因: cfMeDIP-seq揭示cfDNA甲基化高效区分原发性和转移性前列腺|Nat Commun

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 前列腺癌&#xff08;Prostate cancer&#xff0c;PCa&#xff09;是男性中第二常见的恶性肿瘤&#xff0c;也是全球癌症相关死亡的第三大原因。虽然大多数原发性前列腺癌可以治愈&#…...

CMake 教程跟做与翻译 4

目录 添加一个option! 添加一个option! option&#xff0c;正如其意&#xff0c;就是选项的意思。我们这里需要演示一下option的做法。 option对于大型的工程必然是非常常见的&#xff1a;一些模块会被要求编译&#xff0c;另一些客户不准备需要这些模块。option就是将这种需…...

MySQL面试题分享

慢日志&#xff08;了解&#xff09; 慢日志开启的变量&#xff1a;slow_query_logON; 如果值为 OFF ,那就是没有开启慢日志 耗时&#xff1a; long_query_time&#xff0c;默认是10秒 redis 和 mysql 慢日志的区别 redis 慢日志默认是没有开启的 mysql 慢日志默认是开启的…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...