JDK17常用新特性

news2024/11/23 23:43:41

目前国内大部分开发人员都是在使用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,
                              AGE
                      FROM T_STUDENT
                      WHERE 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 {

        @Override
        public void baseMethod() {
                System.out.println("我是密封子类1");
        }

}

public final class Demo_SubSealedClass2 extends Demo_SealedClass{

        @Override
        public 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.coloradmin.cn/o/2209328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手写mybatis之解析和使用ResultMap映射参数配置

前言 学习源码是在学习什么呢? 就是为了通过这些源码级复杂模型中,学习系统框架的架构思维、设计原则和设计模式。在这些源码学习手写的过程中,感受、吸收并也是锻炼一种思维习惯,并尝试把这些思路技术迁移到平常的复杂业务设计开…

MD5消息摘要算法学习

MD5(Message Digest Algorithm 5)是一种广泛使用的哈希函数,它用于生成128位的哈希值(也称为消息摘要)。MD5主要用于确保信息的完整性,即可以通过对数据生成的哈希值来验证数据是否被篡改。尽管MD5在过去被…

60. 排列序列【回溯】

文章目录 60. 排列序列解题思路Go代码 60. 排列序列 60. 排列序列 给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n 3 时, 所有排列如下: “123”“132”“213”“231”“31…

SpringBoot 集成GPT实战,超简单详细

Spring AI 介绍 在当前的AI应用开发中,像OpenAI这样的GPT服务提供商主要通过HTTP接口提供服务,这导致大部分Java开发者缺乏一种标准化的方式来接入这些强大的语言模型。Spring AI Alibaba应运而生,它作为Spring团队提供的一个解决方案&…

Spring Boot 3 文件管理:上传、下载、预览、查询与删除(全网最全面教程)

在现代Web应用中,文件管理是一个非常重要的功能。Spring Boot作为Java开发领域的热门框架,提供了丰富的工具和API来简化文件管理的操作。本文将详细介绍如何使用Spring Boot 3进行文件的上传、下载、预览、查询与删除操作,并提供一个完整的示…

OpenCV 环境配置

首先下载opencv,在opencv官网进行下载。 按照上面的步骤,点击进去 滑至底部,不切换至不同页,选择合适的版本进行下载(Window系统选择Windows版本进行下载)。 接下来以4.1.2版本为例: 点击之后会进入这个页面&#xff…

聚类分析 | NRBO-GMM聚类优化算法

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 (创新)NRBO-GMM聚类优化算法 (NRBO聚类优化,创新,独家) 牛顿-拉夫逊优化算法优化GMM高斯混合聚类优化算法 matlab语言,一键出图,直接运行 1.牛顿-拉夫逊优化算法(New…

STM32—BKP备份寄存器RTC实时时钟

1.BKP简介 BKP(Backup Registers)备份寄存器BKP可用于存储用户应用程序数据。当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位TAMP…

教培机构如何向知识付费转型

在数字化时代,知识付费已成为一股不可忽视的潮流。面对这一趋势,教育培训机构必须积极应对,实现向知识付费的转型,以在新的市场环境中立足。 一、教培机构应明确自身的知识定位。 在知识付费领域,专业性和独特性是关键…

【Python】selenium获取鼠标在网页上的位置,并定位到网页位置模拟点击的方法

在使用Selenium写自动化爬虫时,遇到验证码是常事了。我在写爬取测试的时候,遇到了点击型的验证码,例如下图这种: 这种看似很简单,但是它居然卡爬虫?用简单的点触验证码的方法来做也没法实现 平常的点触的方…

数据迁移:如何保证在不停机的情况下平滑的迁移数据

1. 引言 数据迁移是一个常见的需求,比如以下的场景,我们都需要进行数据迁移。 大表修改表结构单表拆分进行分库分表、扩容系统重构,使用新的表结构来存储数据 2. 迁移准备 2.1 备份工具 2.1.1 mysqldump mysqldump 是 MySQL 自带的用于…

【计网】从零开始认识https协议 --- 保证安全的网络通信

在每个死胡同的尽头, 都有另一个维度的天空, 在无路可走时迫使你腾空而起, 那就是奇迹。 --- 廖一梅 --- 从零开始认识https协议 1 什么是https协议2 https通信方案2.1 只使用对称加密2.2 只使用非对称加密2.3 双方都使用非对称加密2.4 …

Winform和WPF的技术对比

WinForms(Windows Forms)和WPF(Windows Presentation Foundation)是用于创建桌面应用程序的两种技术。尽管两者都可以用于开发功能强大的Windows应用程序,但它们的设计理念、功能和开发体验都有显著区别。在本文中&…

(亲测可行)ubuntu下载安装c++版opencv4.7.0和4.5.0 安装opencv4.5.0报错及解决方法

文章目录 🌕系统配置🌕打开终端,退出anacoda激活环境(如果有的话)🌕安装依赖🌙安装g, cmake, make, wget, unzip,若已安装,此步跳过🌙安装opencv依赖的库🌙安装可选依赖 …

Smartfusion2开发环境的搭建

Libero软件安装包括libero安装、bibero补丁安装、bibero的license添加和官方ip库的添加等4部分内容组成。具体内容如下所示: 1 Libero软件安装 1、解压LiberoSoC_v11.8的安装包到当前目录,然后运行Libero中的可执行软件进行安装; 图1 双击l…

Javascript实现Punycode编码/解码

Punycode编码/解码的Javascript实现。 用法 const punycode require(punycode); console.log(punycode.encode(用法)); //nwwn1p console.log(punycode.decode(nwwn1p)) //用法console.log(punycode.toIDN(用法.中国)); //xn--nwwn1p.xn--fiqs8s console.log(punycode.fromI…

【AAOS】Android Automotive 13模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r69 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch sdk_car_x86_64-userdebug make -j8 运行效果 emualtor HomeMapAll appsSettings…

CUDA-X

NVIDIA CUDA-X 文章目录 前言一、CUDA-X 微服务CUDA-X 微服务CUDA-X 库二、CUDA-X 数据处理三、CUDA-X AI四、CUDA-X HPC总结前言 适用于 AI 的采用 GPU 加速的微服务和库。 释放 GPU 在 AI 应用程序中的潜能 探索 NVIDIA CUDA-X AI 正在推动变革的 AI 领域和可在其中使用的 G…

win10 解决Qt编译得到的可执行文件 *.exe 无法启动的问题

问题描述 在Qt 5.12.4 写了一个服务端程序,编译可以通过,但是打开debug目录下的可执行文件,就报以下错误: 解决方案 方法一 复制缺失的dll到TCPServer.exe目录下 方法二 可能是系统环境变量没有配好 将你电脑上的Qt安装目录…

linux入门——“权限”

linux中有权限的概念,最常见的就是安装一些命令的时候需要输入sudo来提权,那么为什么要有这个东西呢? linux是一个多用户操作系统,很多东西看起来是有很多分,但是实际的存储只有一份(比如命令,不…