java8以上版本

news/2024/9/13 9:20:19/文章来源:https://blog.csdn.net/weixin_42707397/article/details/110422525

java9及其以上版本

  • 一、JDK17 LTS 常用新特性
    • 1、switch语句的增强
    • 2、字符串拼接
    • 3、判断类型instanceof自动类型转换
    • 4、密封类 关键字 sealed permits
    • 5、record类
    • 6、优化空指针异常
    • 7、ZGC垃圾收集器

一、JDK17 LTS 常用新特性

1、switch语句的增强

在 Java 17中,switch 表达式得到了显著增强,支持了模式匹配(pattern matching)和 yield 语句。不过,需要注意的是,这里的 yield 不是关键字,而是 switch 表达式中用于返回值的表达式。

在 Java 17 之前,switch 语句主要用于整型和枚举类型,并且通常用于选择执行哪个代码块。而在 Java 17 中,switch 表达式(注意是表达式,不是语句)可以返回一个值,并且支持更广泛的类型(如字符串、对象等)以及模式匹配。

使用新的 switch 表达式时,你可以使用 -> 符号和表达式(或代码块)来指定每个 case 的结果。然而,在某些情况下,你可能想要从 switch 表达式的某个 case 中返回一个值,并立即退出 switch。在这种情况下,你可以使用类似于局部变量声明的语法,但使用 yield 关键字来返回该值。

以下是一个示例,展示了如何在 Java 17 中使用 switch 表达式和 yield:

String text = "Hello";  
String result = switch (text) {  case "Hello" -> {  System.out.println("Matched Hello");  yield "Greeting"; // 使用 yield 返回一个值  }  case "World" -> "Salutation";  default -> {  System.out.println("No match found");  yield "Unknown"; // 使用 yield 返回一个默认值  }  
};  System.out.println(result); // 输出:Greeting

在上面的示例中,switch 表达式根据 text 变量的值进行匹配,并使用 yield 语句从每个 case 中返回一个字符串。注意,每个 case 都可以是一个代码块,并且在这个代码块中,你可以使用 yield 来返回一个值,该值将成为整个 switch 表达式的结果。

需要注意的是,虽然这种语法看起来像是在使用局部变量,但实际上 yield 并不是声明一个变量;它只是从 switch 表达式中返回一个值。此外,yield 只能用在 switch 表达式的 case 分支中,并且每个 case 分支必须有一个 yield 语句(除非它是空的,或者是 throw 语句)。

其他使用案例如下图:
在这里插入图片描述

2、字符串拼接

在这里插入图片描述

3、判断类型instanceof自动类型转换

在这里插入图片描述
可以看到上图中jdk8的instanceof判断类型后,还需要手动做一次强制类型转换,jdk17可以简化写法。

4、密封类 关键字 sealed permits

限制继承,被sealed修饰的父类只能被后面permits修饰的指定子类继承。并且指定子类必须用non-sealed(可以被孙子类继承)或者final(此子类无法再被孙子类继承)修饰。

  • 注意:
    1、密封类的父类和子类必须在同一个包下。
    2、被permits修饰的子类只能继承sealed修饰的父类,不能继承其他类。
public sealed interface Shape permits Circle, Rectangle {   
}  public final class Circle implements Shape {   
}  public non-sealed class Rectangle implements Shape {  
}  // 尝试创建一个不在permits列表中的类来实现Shape会导致编译错误  
// public final class Triangle implements Shape { ... } // 编译错误

5、record类

在这里插入图片描述

类似lombok的属性只读对象,此类可以隐式的实现全参构造方法(没有无参构造方法)和属性的get方法,没有set方法。也会重写equals(), hashCode(), toString()。

record类的特点:
紧凑的语法:Record类允许你使用更简洁的语法来定义数据类。
自动生成方法:Record类自动为你生成equals(), hashCode(), toString(), 以及所有的getter方法。
不可变性:Record类的字段默认是final的,这意味着Record类的实例是不可变的。
组件解构:Record类支持组件解构(component decomposition),允许你在模式匹配中使用它们。
record类的定义和普通class是不一样的,代码如下:

public record Point(int x, int y) {  // 这里不需要显式定义任何方法,因为Record类会自动为你生成  
}

6、优化空指针异常

可以具体定位到哪一行的哪一个方法报空指针,以前只能定位到哪一行
在这里插入图片描述

7、ZGC垃圾收集器

垃圾回收不卡顿,JVM ZGC(Z Garbage Collector)解释
ZGC是Oracle在JDK
11中引入的一种创新垃圾收集算法,其设计目标主要是为了实现低延迟和高吞吐量的内存管理。以下是关于ZGC的详细解释:
一、主要特点
低延迟:ZGC的主要目标是确保持续较短的暂停时间,通过减少STW(Stop-The-World)暂停来实现。JDK 11中,ZGC的停顿时间不超过10ms,且不会随着堆内存的增大而变长。在JDK 16及之后的版本中,GC暂停时间已经缩小到1ms以内,并且时间复杂度是O(1),即GC停顿时间是一个固定值,不会受堆内存大小影响。
高吞吐量:ZGC通过优化垃圾收集操作和内存分配策略,可以在高负载的情况下提供更高的吞吐量。这意味着ZGC可以在短时间内完成更多的垃圾收集任务,从而提高Java应用程序的性能。
高内存利用率:ZGC通过动态调整内存布局和回收策略,可以更有效地利用内存资源。这使得ZGC可以在有限的内存空间内运行更多的Java应用程序实例,从而降低内存成本。
二、工作原理

ZGC采用了全新的设计思路,摒弃了传统的分代收集策略,而是将整个堆内存看作一个整体。它使用读屏障(Read
Barrier)和染色指针(Colored Pointer)技术来实现并发标记和整理。ZGC的工作过程可以分为以下几个阶段:

并发标记(Concurrent Marking):ZGC在标记阶段采用SATB(Snapshot-At-The-Beginning)算法,通过读屏障记录对象引用关系的变化。同时,ZGC引入了染色指针技术,将对象的引用信息存储在指针本身,从而避免了额外的内存开销。
再标记(Remark):在并发标记完成后,ZGC会暂停应用线程进行短暂的再标记操作,以处理在并发标记阶段未能处理的对象引用变化。这个停顿时间通常非常短,对应用性能的影响微乎其微。
并发整理(Concurrent Relocation):在再标记完成后,ZGC会进入并发整理阶段。与传统垃圾收集器的整理阶段不同,ZGC的整理操作是并发的,即与应用线程同时运行。这得益于ZGC的染色指针技术,使得对象在移动过程中仍然可以被正确地访问。
引用更新(Reference Processing)和弱引用处理(Weak Reference
Processing):在并发整理过程中,ZGC还需要处理对象的引用更新和弱引用。
三、性能优势
线程无关性:ZGC是一个线程无关的垃圾收集器,这意味着它可以在不同的线程之间并行执行垃圾收集任务,进一步提高应用程序的吞吐量。
无锁设计:ZGC采用了无锁设计,避免了锁定导致的竞争条件和死锁等问题,进一步提高了应用程序的性能。 四、适用场景

ZGC非常适合对延迟敏感的应用场景,如在线交易、实时数据分析等。同时,由于其可伸缩性设计,ZGC也适用于大规模堆内存和高吞吐量应用,是云计算和大数据领域的理想选择

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

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

相关文章

外卖系统源码开发全攻略:外卖小程序与后台管理系统的设计与实现

今天,小编将详细介绍外卖系统源码的开发全攻略,从需求分析到设计与实现,为开发者提供全面指导。 一、需求分析 1.用户需求 用户是外卖系统的核心,需满足以下基本需求: -浏览菜单并下单 -实时追踪订单 -多种支付方…

【从零开始学习RabbitMQ | 第二篇】如何确保MQ的可靠性和消费者可靠性

目录 前言: MQ可靠性: 数据持久化: Lazy Queue: 消费者可靠性: 消费者确认机制: 消费失败处理: MQ保证幂等性: 方法一: 总结: 前言: …

这款网站测试工具,炫酷且强大!【送源码】

随着互联网的普及和发展,Web 应用程序的数量也越来越多,各种网络问题也是层出不穷,因而监测这些 Web 应用程序的性能和可用性变得非常重要。 今天的文章,了不起和大家分享一款十分好用的的网站分析项目 - Web-Check。 项目简介 …

谷歌浏览器安装devtools工具

在浏览器中输入极简插件,然后打开如下的网页,在搜素框中输入vue 出现下图 点击推荐下载 (地址:https://chrome.zzzmh.cn/info/nhdogjmejiglipccpnnnanhbledajbpd) 打开谷歌浏览器如图 选择“扩展程序” 点开之后&…

互联网的利

在互联网没发明之前,人类说话要近距离的说,玩游戏要近距离的玩,十分麻烦。于是,互联网解决了这个问题。聊天可以在电脑上聊,玩游戏可以用游戏软件查找玩家来玩,实现了时时可聊,时时可玩的生活。…

Spring - Spring Cache 缓存注解这样用,实在是太香了!

作者最近在开发公司项目时使用到 Redis 缓存,并在翻看前人代码时,看到了一种关于 Cacheable 注解的自定义缓存有效期的解决方案,感觉比较实用,因此作者自己拓展完善了一番后分享给各位。 Spring 缓存常规配置 Spring Cache 框架给…

C++ 常量和变量

1 常量 具体把数据写出来 2,3&#xff0c;4&#xff1b;1.2 1.3;“Hello world!”,“C” cout<<2015 常量&#xff1a;不能改变的量。 字面常量&#xff08;字面量、直接常量&#xff09;:直接写出的数据。 符号常量&#xff1a;用符号表示数据&#xff0c;但它一旦确定…

mysqldump提示Using a password on the command line interface can be insecured的解决办法

mysql数据库备份一句话执行命令 mysqldump --all-databases -h127.0.0.1 -uroot -p123456 > allbackupfile.sql 提示如下提示 [rootyfvyy5b2on3knb8q opt]# mysqldump --all-databases -h127.0.0.1 > allbackupfile.sql mysqldump: Couldnt execute SELECT COLUMN_NA…

Modbus TCP转Profinet网关测试配置案例

本案例采用XD-ETHPN20网关做为Modbus TCP通信协议设备与Profinet通信协议设备连接的桥梁。Modbus TCP是一种基于TCP/IP协议的工业通信协议&#xff0c;而Profinet则是用于太网通信的协议。Modbus TCP转Profinet网关可实现这两种不同协议之间的数据交换和传输&#xff0c;极大地…

rk3568_mutex

文章目录 前言1、什么是mutex?1.1mutex互斥体API函数二、实验2.1实验目的2.2源码2.3结果图前言 本文记录的是rk3568开发板基础上做的mutex实验 1、什么是mutex? mutex是互斥体,它是比信号量semaphore更加专业的机制。 在我们编写Linux驱动的时候遇到需要互斥的地方建议使用…

Golang协程和通道

文章目录 协程&#xff08;goroutine&#xff09;基本介绍GMP模型协程间共享变量 通道&#xff08;channel&#xff09;基本介绍channel的定义方式channel的读写channel的关闭channel的遍历方式只读/只写channelchannel最佳案例select语句 协程&#xff08;goroutine&#xff0…

[less配置]vue2引入less

1、终端输入&#xff1a;npm install less less-loader --save-dev 2、在package.json查看是否安装less依赖 3、调用

Spring MVC+mybatis 项目入门:旅游网(二) dispatcher与controller与Spring MVC

个人博客&#xff1a;Spring MVCmybatis 项目入门:旅游网&#xff08;二&#xff09;dispatcher与controller与Spring MVC | iwtss blog 先看这个&#xff01; 这是18年的文章&#xff0c;回收站里恢复的&#xff0c;现阶段看基本是没有参考意义的&#xff0c;技术老旧脱离时代…

HCIP的学习(25)

VLAN间通讯技术 使用多臂路由的方式 ​ 路由器的物理接口默认是不识别802.1Q标签的&#xff0c;所以&#xff0c;交换机连接路由器的接口在发送数据帧时&#xff0c;应该将标签剥离。----一般常使用Access接口配置。 单臂路由 ​ 所谓的单臂路由&#xff0c;实际上试讲路由器…

MySQL简单测试和安装

MySQL 的特点 1、MySQL 性能卓越、服务稳定&#xff0c;很少出现异常宕机。 2、MySQL开放源代码且无版权制约&#xff0c;自主性及使用成本低。 3、MySQL历史悠久(版本众多)&#xff0c;用户使用活跃&#xff0c;遇到问题可以寻求帮助。 4、MySQL体积小(相对大型关系型数据库)…

Qt Creator(2)【如何在Qt Creator中创建新工程】

阅读导航 引言一、Qt Creator开始界面介绍二、如何在Qt Creator中创建新工程1. 新建项目2. 选择项目模板3. 选择项目路径4. 选择构建系统5. 填写类信息设置界面6. 选择语言和翻译文件7. 选择Qt套件8. 选择版本控制系统9. 最终效果 三、认识Qt Creator项目内容界面1. 基本界面2.…

Java Object类方法介绍

Object作为顶级类&#xff0c;所有的类都实现了该类的方法&#xff0c;包括数组。 查询Java文档&#xff1a; 1、object.eauqls(): 其作用与 有些类似。 &#xff1a; 是一个比较运算符&#xff0c;而不是一个方法。 ①可以判断基本类型&#xff0c;也可以判断引用类型。 ②若…

鲜花门店小程序开发流程:详细教程,让你轻松掌握

想要开发一款专属于自己鲜花门店的小程序吗&#xff1f;不知道从何开始&#xff1f;别担心&#xff0c;本文将为你提供详细的开发流程&#xff0c;帮助你轻松掌握。 1. 注册登录乔拓云网并进入操作后台 首先&#xff0c;你需要注册并登录乔拓云网&#xff0c;然后进入操作后台…

鹏哥C语言复习——调试

目录 什么是调试&#xff1f; Debug和Release&#xff1a; 调试方法&#xff1a; 环境准备&#xff1a; 调试快捷键介绍&#xff1a; 调试快捷键注意事项&#xff1a; 监视与内存查看&#xff1a; 数组元素的监视&#xff1a; 编译常见错误归类&#xff1a; 编译型错…

C++容器之位集(std::bitset)

目录 1 概述2 使用实例3 接口使用3.1 constructor3.2 count_and_size3.3 test3.4 any3.5 none3.6 all3.7 set3.8 reset3.9 filp3.10 to_string3.11 to_ulong3.12 to_ullong3.13 operators1 概述 位集存储位(只有两个可能值的元素:0或1,true或false,…)。   该类模拟bool…