JDK17 中的新特性初步了解

1. Switch 语句的增强

jdk12 ,switch语句不用写break了,直接写箭头和对应的值。

jdk 17中, 加了一个逗号,用于匹配多对一。

 如果要在每个case里写逻辑,可以写在花括号里。 在返回值的前面加上yield的关键字。

 也可以对类型匹配

    public static void testPatternMatchSwitch(Object o) {switch (o) {case null -> System.out.println("首先判断对象是否为空,走空指针逻辑等后续逻辑");case String s -> System.out.println("判断是否为字符串,s:" + s);case Record p -> System.out.println("判断是否为Record类型: " + p.toString());case int[] arr -> System.out.println("判断是否为数组,展示int数组的长度" + arr.length);case Integer i -> System.out.println("判断是否为Intger对象,i:" + i);default -> System.out.println("Something else");}}

2. 字符串拼接

jdk15,提供了一个文本块的特性,可以直接三个双引号。 

jdk17的时候提供两个字符, \是用于将两行连接为一行,\s允许前面加空格。 

3. instanceof 的增强

jdk14 预览版,jdk16, jdk17 对 instanceof增强了。

 4. 密封类(sealed classes)

1. 创建一个Animal 只能被  Cat 和 Dog类继承。

2. Animal ,Cat 和 Dog类必须都在同一个包下面。

3. 其它的类无法继承 Animal ,Cat 类 。 Dog可以被继承,因为是non-sealed修饰。注意Cat 和 Dog类只能被final和non-sealed修饰

public abstract sealed class Animal permits Cat, Dog {
}

/*** Final 代表 cat 无法再次被子类继承*/
public final class Cat extends Animal {
}
/*** non-sealed 代表可以被再次继承*/
public non-sealed class Dog extends Animal{
}

优点: 更安全,可控,易维护。

5. Record类

类似于lombok中的属性只读对象

record 类 提供了全参的构造方法,get方法,没有set方法。

public record RecordExample(Long id, String name) {
}

查看字节码会发现,其实java的编译器给我们在编译的生成了构造方法和get方法。

public record RecordExample(Long id, String name) {public RecordExample(Long id, String name) {this.id = id;this.name = name;}public Long id() {return this.id;}public String name() {return this.name;}
}

测试一下Record中的equal方法。会发现只要属性相同,结果是相同的。

public class TestRecord {public static void main(String[] args) {RecordExample example1 = new RecordExample(1l, "name1");RecordExample example2 = new RecordExample(1l, "name1");System.out.println(example1.equals(example2));}
}

6. 优化了空指针异常

1)、说明

Java15新特性,就是把NullPointerException异常的日志做了优化打印的更人性化。

2)、案例

可以看到,提示会更有指向性,意味着以后在复杂的生产环境排错过程中,你很可能不会再被空指针异常所困扰。
public class TestNPE {public static void main(String[] args) {User user = new User();user.getUserName().toLowerCase();}
}

运行之后的错误信息,可以很容易定位到哪里为null.

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because the return value of "com.sealed.example.User.getUserName()" is null
    at com.sealed.example.TestNPE.main(TestNPE.java:8)

6. ZGC垃圾收集器

jdk11就有了 , jdk15 已经正式转正, jdk17 zgc已经很成熟了。

ZGC的优点是,垃圾回收不卡顿。也就是说没有了STW- stop the world. 卡的时间是小于10ms.

堆内存可以设置很大,甚至可以是T级别。

ZGC 高吞吐。

ZGC 低延迟

 很小的 pause time.

更少的额外资源利用。

GC progress from JDK 8 to JDK 17

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

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

相关文章

C++ 编程入门(一)—— Hello World

C 是什么环境搭建第一个 C 程序本篇结语 C 是什么 C 是一种面向对象的计算机程序设计语言,由美国 AT&T 贝尔实验室的 Bjarne Stroustrup 在 20 世纪 80 年代初期发明并实现(最初这种语言被称作 “C with Classes” 带类的 C 语言)。它是一…

多线程案例 | 单例模式、阻塞队列、定时器、线程池

多线程案例 1、案例一:线程安全的单例模式 单例模式 单例模式是设计模式的一种 什么是设计模式? 设计模式好比象棋中的 “棋谱”,红方当头炮,黑方马来跳,针对红方的一些走法,黑方应招的时候有一些固定的…

ScheduledThreadPoolExecutor 及 ThreadPoolExecutor的基本使用及说明

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览2.1 为什么不推荐使用Executors去创建线程池 三、…

C++ list底层实现原理

文章目录 一、list底层实现二、类构成三、构造函数四、迭代器五、获取第一个元素六、获取最后一个元素七、插入元素 一句话:list底层实现一个双向循环链表 一、list底层实现 一个双向循环链表 二、类构成 class list : protected_List_base_list_base.lsit_impl…

python进阶书籍的推荐 知乎,python入门后如何进阶

本篇文章给大家谈谈python进阶书籍的推荐 知乎,以及python入门后如何进阶,希望对各位有所帮助,不要忘了收藏本站喔。 1、Python应该怎么学_python应该怎么学 想要学习Python,需要掌握的内容还是比较多的,对于自学的同…

【MySQL】索引特性

​🌠 作者:阿亮joy. 🎆专栏:《零基础入门MySQL》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录 👉没…

重大更新|Sui主网即将上线流动性质押,助力资产再流通

Sui社区一直提议官方上线流动质押功能,现在通过SIP过程,已经升级该协议以实现这一功能。 Sui使用委托权益证明机制(DPoS)来选择和奖励负责运营网络的验证节点。为了保障网络安全,验证节点通过质押SUI token获得质押奖…

抖音短视频矩阵系统源码:SEO优化开发解析

抖音短视频矩阵系统源码是一个基于抖音短视频平台的应用程序。它允许用户上传和观看短视频,以及与其他用户交互。SEO优化开发解析是指对该系统进行搜索引擎优化的开发解析。 一、 在进行SEO优化开发解析时,可以考虑以下几点: 关键词优化&…

Java Stream流

Java 8 版本新增的Stream,配合同版本出现的Lambda ,给我们操作集合(Collection)提供了极大的便利。Stream流是JDK8新增的成员,允许以声明性方式处理数据集合,可以把Stream流看作是遍历数据集合的一个高级迭…

linux 系统编程

C标准函数与系统函数的区别 什么是系统调用 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface,API)。是应用程序同系统之间数据交互的桥梁。 一个helloworld如何打印到屏幕。 每一个FILE文件流(标准C库函数&#xff…

前端调用合约如何避免出现transaction fail

前言: 作为开发,你一定经历过调用合约的时候发现 gas fee 超出限制,但是不知道报了什么错。这个时候一般都是触发了require错误合约校验。对于用户来说他不理解为什么一笔交易会花费如此大的gas,那我们作为开发如何尽量避免这种情…

Jvm的一些技巧

反编译字节码文件 找到对应的class文件所在的目录,使用javap -v -p 命令 查询运行中某个Java进程的Jvm参数 【案例】查询 MethodAreaDemo 这个类运行过程中,初始的元空间大小 MetaspaceSize jps 查询 Java 进程的进程ID ![在这里插入图片描述](https…

新零售行业如何做会员管理和会员营销

蚓链数字化营销系统全渠道会员管理解决方案,线上线下统一管理,打造私域流量,微信、门店会员全渠道管理,打通私域流量池,实现裂变营销: 开启新零售之路,必然要摒弃原有的管理模式,大…

C# NDArray System.IO.FileLoadException报错原因分析

C# NDArray System.IO.FileLoadException 报错原因分析: 1.NuGet程序包版本有冲突 2.统一项目版本 1.打开解决方案NuGet程序包设置 2.查看是否有版本冲突 3.统一版本冲突

C++终止cin输入while循环时多读取^Z或^D的问题

原代码&#xff1a; istream& operator>>(istream& is, map<string, int>&mm) {string ss"";int ii0;is >> ss>>ii;mm[ss]ii;return is; }int main() {map<string,int>msi;while(cin>>msi);return 0; } 问题&…

【探讨】Java POI 处理 Excel 中的名称管理器

前言 最近遇到了一些导表的问题。原本的导表工具导不了使用名称管理器的Excel。 首先我们有两个Sheet。B1用的是名称管理器中的AAA, 而B2用的对应的公式。 第二个sheet&#xff0c;名为Test2: 这是一段简化的代码&#xff1a; public class Main {public static void mai…

【Python】将M4A\AAC录音文件转换为MP3文件

文章目录 m4aaac 基础环境&#xff1a; sudo apt-get install ffmpegm4a 要将M4A文件转换为MP3文件&#xff0c;你可以使用Python中的第三方库pydub。pydub使得音频处理变得非常简单。在开始之前&#xff0c;请确保你已经安装了pydub库&#xff0c;如果没有&#xff0c;可以通…

7.25 Qt

制作一个登陆界面 login.pro文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on …

【Spring】更简单的读取和存储对象,五大类注解

经过前面的学习&#xff0c;我们已经可以实现基本的 Spring 读取和存储对象的操作了&#xff0c;但在操作的过程中我们发现读取和存储对象并没有想象中的那么 “简单”&#xff0c;所以接下来我们要学习更加简单的操作 Bean 对象的方法 在 Spring 中想要更简单的存储和读取对象…

Docker镜像端口映射简介及配置指南

目录 引言&#xff1a;什么是端口映射&#xff1f;配置端口映射的步骤&#xff1a;1. 创建Docker镜像&#xff1a;2. 选择要映射的端口&#xff1a;3. 运行容器并进行端口映射&#xff1a;4. 验证端口映射&#xff1a; 示例&#xff1a;结论&#xff1a; 引言&#xff1a; Doc…