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提高内存回收。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/446417.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程-初阶(2)BlockingQueueThreadPoolExecutor

学习目标: 熟悉wait和notify的线程休眠和启动 熟悉多线程的基本案例 1.单例模式的两种设置模式:懒汉模式和饿汉模式 2.阻塞队列(生产者消费者模型) 3.线程池 4.定时器 1.wait和notify 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是…

【消息队列】Kafka从入门到面试学习总结

国科大学习生活(期末复习资料、课程大作业解析、大厂实习经验心得等): 文章专栏(点击跳转) 大数据开发学习文档(分布式文件系统的实现,大数据生态圈学习文档等): 文章专栏(点击跳转&…

人工智能的核心技术之机器学习

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 人工智能(AI)核心技…

使用DataX同步hive数据到MySQL

目录 1、组件环境 2、安装datax 2.1、下载datax并解压 3、安装datax-web 3.0、下载datax-web的源码,进行编译 3.1、在MySQL中创建datax-web元数据 3.2、安装data-web 3.2.1执行install.sh命令解压部署 3.2.1、手动修改 datax-admin配置文件 3.2.2、手动修改…

「Ubuntu」文件权限说明(drwxr-xr-x)

我们在使用Ubuntu 查看文件信息时,常常使用 ll 命令查看,但是输出的详细信息有些复杂,特别是 类似与 drwxr-xr-x 的字符串,在此进行详细解释下 属主:所属用户 属组:文件所属组别 drwxr-xr-x 7 apps root 4…

Pytorch基础:设置随机种子

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 有时候,如果需要代码在多个运行中具有可重复性,可以通过以下方式来设置随机种子: import torch import numpy as np import r…

【亲测可行】最新ubuntu搭建rknn-toolkit2

文章目录 🌕结构图(ONNX->RKNN)🌕下载rknn-toolkit2🌕搭建环境🌙配置镜像源🌙conda搭建python3.8版本的虚拟环境🌙进入packages目录安装依赖库🌕测试安装是否成功🌕其它🌙rknn-toolkit2🌙rknn_model_zoo🌙关于部署的博客发布本文的时间为2024.10.13…

【进阶OpenCV】 (11)--DNN板块--实现风格迁移

文章目录 DNN板块一、DNN特点二、DNN函数流程三、实现风格迁移1. 图像预处理2. 加载星空模型3. 输出处理 总结 DNN板块 DNN模块是 OpenCV 中专门用来实现 DNN(Deep Neural Networks,深度神经网络) 模块的相关功能,其作用是载入别的深度学习框架(如 TensorFlow、Caf…

【微信小程序_11_全局配置】

摘要:本文介绍了微信小程序全局配置文件 app.json 中的常用配置项,重点阐述了 window 节点的各项配置,包括导航栏标题文字、背景色、标题颜色,窗口背景色、下拉刷新样式以及上拉触底距离等。通过这些配置可实现小程序窗口外观的个性化设置,提升用户体验。 微信小程序_11_全…

如何成为 Rust 核心贡献者?Rust 开发的核​​心是什么?Rust 重要技术专家揭秘

10 月 17 - 18日,由 GOSIM 开源创新汇主办、CSDN 承办的 GOSIM CHINA 2024 将在北京盛大启幕。作为 GOSIM 开源年度大会的第三届盛会,本次活动邀请了 60 多位国际开源专家,汇聚了来自全球百余家顶尖科技企业、知名高校及开源社区的技术大咖、…

回溯法与迭代法详解:如何从手机数字键盘生成字母组合

在这篇文章中,我们将详细介绍如何基于手机数字键盘的映射,给定一个仅包含数字 2-9 的字符串,输出它能够表示的所有字母组合。这是一个经典的回溯算法问题,适合初学者理解和掌握。 问题描述 给定一个数字字符串,比如 …

python基础路径的迁移

本人未安装anaconda或pycharm等,仅安装了某个python环境,因此以下方法仅针对基础python环境的迁移,不确保其他软件或插件正常运行 第一步将原python路径的整个文件夹剪切到新的路径下 第二步修改系统环境变量,将原来的python路径…

php 生成随机数

记录:随机数抽奖 要求:每次生成3个 1 - 10 之间可重复(或不可重复)的随机数,10次为一轮,每轮要求数字5出现6次、数字4出现3次、…。 提炼需求: 1,可设置最小数、最大数、每次抽奖生…

鸿蒙--商品列表

这里主要利用的是 List 组件 相关概念 Scroll:可滚动的容器组件,当子组件的布局尺寸超过父组件的视口时,内容可以滚动。List:列表包

AI+若依框架day02

项目实战 项目介绍 帝可得是什么 角色和功能 页面原型 库表设计 初始AI AIGC 提示工程 Prompt的组成 Prompt练习 项目搭建 点位管理 需求说明 库表设计

浏览器中使用模型

LLM 参数越来越小,使模型跑在端侧成为可能,为什么要模型跑在端侧呢,首先可以节省服务器的算力,现在 GPU 的租用价格还是比较的高的,例如租用一个 A10 的卡1 年都要 3 万多。如果将一部分算力转移到端侧通过小模型进行计…

【LeetCode热题100】分治-快排

本篇博客记录分治快排的4道题目&#xff1a;颜色分类、排序数组、数组中的第K个最大元素、数组中最小的N个元素&#xff08;库存管理&#xff09;。 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int left -1,right n;for(int…

React速成

useRef获取DOM 组件通讯 子传父 function Son({ onGetMsg }){const sonMsg this is son msgreturn (<div>{/* 在子组件中执行父组件传递过来的函数 */}<button onClick{()>onGetMsg(sonMsg)}>send</button></div>) }function App(){const getMsg…

Python基础常见面试题总结

文章目录 1.深拷贝与浅拷贝2.迭代器3.生成器4.装饰器5.进程、线程、协程6.高阶函数7.魔法方法8.python垃圾回收机制 1.深拷贝与浅拷贝 浅拷贝是对地址的拷贝&#xff0c;只拷贝第一层&#xff0c;第一层改变的时候不会改变&#xff0c;内层改变才会改变。深拷贝是对值的拷贝&a…

智能驾驶|迈向智能出行未来,AI如何应用在自动驾驶?

自动驾驶通过人工智能&#xff08;AI&#xff09;、机器学习、传感器融合和实时数据处理&#xff0c;使车辆能够在无需人类干预的情况下自主驾驶。随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;与智能汽车的结合正在成为现代交通运输领域的热潮。无人驾驶…