【Java基础-JDK21新特性】它发任它发,我用java8

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

      • 1.介绍
      • 2.版本
      • 3.JDK21 新特性
      • 4.安装 jdk21
      • 5.虚拟线程
      • 6.有序集合
      • 7.记录模式
      • 8.switch 模式匹配

1.介绍

JDK 21 已经于 2023 年 9 月 19 日正式发布。本文总结了 JDK 21 发布的新特性。

根据发布的规划,这次发布的 JDK 21 将是一个长期支持版(LTS 版)。LTS 版每 2 年发布一个,上一次长期支持版是 21 年 9 月发布的 JDK 17。不能抱有你强任你强,我用 java8 的思想。

2.版本

主要分为 OpenJDK 版本和 Oracle 版本,下载地址如下:

  • OpenJDK 版本:https://jdk.java.net/21/
  • Oracle 版本:https://www.oracle.com/java/technologies/downloads/

3.JDK21 新特性

  • 序列集合
  • 分代 ZGC
  • 记录模式
  • switch 模式匹配
  • 虚拟线程
  • 弃用 Windows 32 位 x86 移植
  • 不允许动态加载代理
  • 密钥封装机制

4.安装 jdk21

image-20230926013250793

image-20230926013311968

5.虚拟线程

将虚拟线程(Virtual Threads)引入 Java 平台。虚拟线程是轻量级线程,可以显著减少编写、维护和观察高吞吐量并发应用程序的工作量。

  1. 轻量级线程管理:虚拟线程不需要底层操作系统线程的支持,因此可以创建数千甚至数万个虚拟线程而不会消耗大量的内存和资源。这使得应用程序可以更高效地管理大量并发任务。
  2. 更快的线程创建和销毁:传统的 Java 线程创建和销毁通常涉及昂贵的操作系统调用,而虚拟线程的创建和销毁成本更低,因此可以更快速地启动和停止线程。
  3. 更好的资源利用:由于虚拟线程可以更轻松地伸缩,因此它们有助于更好地利用现有的系统资源,以处理大规模的并发请求。
  4. 避免死锁和资源争夺:虚拟线程的管理方式可以减少线程之间的竞争和资源争夺,从而降低了死锁和性能问题的风险。
  5. 简化并发编程:虚拟线程的引入使得编写并发程序变得更加容易,开发人员可以专注于业务逻辑而不必过多关注线程管理和同步。
public class Test01 {public static void main(String[] args) {try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 10000).forEach(i -> executor.submit(() -> {Thread.sleep(Duration.ofSeconds(1));return i;}));}}
}

6.有序集合

在 JDK 21 中,Sequenced Collections 的引入带来了新的接口和方法来简化集合处理。此增强功能旨在解决访问 Java 中各种集合类型的第一个和最后一个元素需要非统一且麻烦处理场景。

Sequenced Collections 引入了三个新接口:

  • SequencedCollection
  • SequencedMap
  • SequencedSet

image-20230926020839133

绿色方框是新增的 3 个接口,从中可以看到已有集合类的继承关系的变化:

  • List 继承自 SequencedCollection。

  • Deque 继承自 SequencedCollection。

  • LinkedHashSet 实现了 SequencedSet 接口。

  • SortedSet 继承自 SequencedSet。

  • LinkedHashMap 实现了 SequencedMap 接口。

  • SortedMap 继承自 SequencedMap。

有了这 3 个新的顺序集合相关的接口之后,Java 代码可以更清楚地表达顺序集合以及顺序集合上的操作。

这些接口附带了一些新方法,以提供改进的集合访问和操作功能。

/*** 序列集合** @author : qinyingjie* @version : 2.2.0* @date : 2023/9/26 01:37*/
public class Test02 {public static void main(String[] args) {SequencedCollection<Integer> arr = new ArrayList<>();arr.addLast(1);arr.addLast(2);arr.addLast(3);arr.addLast(31);arr.addFirst(14);System.out.println(arr);}
}

第一个和最后一个元素的访问:

在 JDK 21 之前,检索 Java 中集合的第一个和最后一个元素涉及不同的方法和途径,具体取决于集合类型。

下面让我们看一下使用 JDK 21 之前的 JDK API 调用访问第一个和最后一个元素的一些示例:

访问位置ListDequeSortedSet
第一个元素list.get(0)deque.getFirst()set.first()
最后一个元素list.get(list.size()-1)deque.getLast()set.last()

可以看到,一个简单的操作,在不同的集合中需要不同的编写方式,非常麻烦!

但在 JDK 21 之后,访问第一个和最后一个元素就方法多了:

对于List, Deque, Set这些有序的集合,访问方法变得统一起来:

  • 第一个元素:collection.getFirst()
  • 最后一个元素:collection.getLast()

首先是 SequencedCollection,该接口的声明如下所示:SequencedCollection 继承自 Collection

interface SequencedCollection<E> extends Collection<E> {SequencedCollection<E> reversed();void addFirst(E);void addLast(E);E getFirst();E getLast();E removeFirst();E removeLast();
}

在包含的方法中:

  • reversed 方法返回一个逆序的 SequencedCollection 对象。

  • addFirst 和 addLast 方法分别在集合的起始和结束位置添加新的元素。

  • getFirst 和 getLast 方法分别获取集合的第一个和最后一个元素。

  • removeFirst 和 removeLast 方法分别删除集合的第一个和最后一个元素。

SequencedSet

interface SequencedSet<E> extends Set<E>, SequencedCollection<E> {SequencedSet<E> reversed();
}

SequencedMap

SequencedMap 继承自 Map,其中的 entry 有确定的出现顺序。

SequencedMap 中的方法比较多,如下所示:

interface SequencedMap<K,V> extends Map<K,V> {SequencedMap<K,V> reversed();SequencedSet<K> sequencedKeySet();SequencedCollection<V> sequencedValues();SequencedSet<Entry<K,V>> sequencedEntrySet();V putFirst(K, V);V putLast(K, V);Entry<K, V> firstEntry();Entry<K, V> lastEntry();Entry<K, V> pollFirstEntry();Entry<K, V> pollLastEntry();
}

具体的方法说明:

  • reversed 方法返回一个 entry 逆序的 SequencedMap。

  • sequencedKeySet 方法返回包含 key 的 SequencedSet。

  • sequencedValues 方法返回包含 value 的 SequencedCollection。

  • sequencedEntrySet 方法返回包含 entry 的 SequencedSet。

  • putFirst 和 putLast 分别在 entry 的最前和最后位置插入名值对。

  • firstEntry 和 lastEntry 分别获取第一个和最后一个 entry。

  • pollFirstEntry 和 pollLastEntry 分别删除第一个和最后一个 entry。

7.记录模式

使用记录模式(Record Patterns)增强 Java 编程语言,以解构记录值。可以嵌套记录模式和类型模式,以实现功能强大、声明性和可组合形式的数据导航和处理。

/*** 记录类** @author : qinyingjie* @date : 2023/9/26*/
public record Test03(int x, int y) {
}

image-20230926021316252

static void print(Object o) {if (o instanceof Test03(int x, int y)) {System.out.println(x + y);}
}

8.switch 模式匹配

通过 switch 表达式和语句的模式匹配来增强 Java 编程语言。通过将模式匹配扩展到 switch,可以针对多个模式测试表达式,每个模式都有一个特定的操作,从而可以简洁、安全地表达复杂的面向数据的查询。

/*** switch模式匹配** @author : qinyingjie* @version : 2.2.0* @date : 2023/9/26 01:37*/
public class Test04 {public static void main(String[] args) {Object obj = "你好";Object a = switch (obj) {case Integer i -> String.format("int %d", i);case String s -> String.format("string %s", s);case Double d -> String.format("Double %s", d);default -> obj.toString();};System.out.println(a);}
}

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

STL set 和 map

文章目录 一、标准库中 set 和 multiset 的使用二、标准库中 map 和 multimap 的使用三、set 和 map 底层红黑树的模拟实现四、set 类 和 map 类的模拟实现 一、标准库中 set 和 multiset 的使用 set 是一颗 K 模型的红黑树&#xff0c;可以存储任意类型&#xff0c;multiset 和…

【数据结构】顺序查找,折半查找,分块查找的知识点总结及相应的代码实现

目录 1、顺序查找 定义及步骤 代码实现 2、折半查找 定义及步骤 代码实现 折半查找判定树 3、分块查找 定义及步骤 1、顺序查找 定义及步骤 顺序查找的定义&#xff1a;从数据集合的起始位置开始&#xff0c;逐一比较每个数据元素&#xff0c;直到找到所要查找…

哈希表的模拟实现

unordered_set: 接口函数&#xff1a; 对应的应用&#xff1a; unrodered_map: 对应的函数接口&#xff1a; 对应的应用&#xff1a; 比较set和unordered_set的效率&#xff1a; 可以看到各个方面hashset是优于set的。 哈希表的模拟实现&#xff1a; 哈希表的实现分为两种&…

什么是Peppol ID?如何创建?

Peppol 网络的两大优势是安全和高效&#xff0c;由于Peppol 最常用于电子发票&#xff0c;因此这些优势在电子发票上展露无遗。相比之下&#xff0c;通过电子邮件发送 PDF 格式的发票和其他文件不仅处理成本较高&#xff0c;而且容易出现发票欺诈。 如果您所在的公共部门组织或…

华为云云耀云服务器 L 实例评测:快速建站的新选择,初创企业和开发者的理想之选

华为云云耀云服务器 L 实例评测&#xff1a;快速建站的新选择&#xff0c;初创企业和开发者的理想之选 文章目录 华为云云耀云服务器 L 实例评测&#xff1a;快速建站的新选择&#xff0c;初创企业和开发者的理想之选导语&#xff1a;摘要&#xff1a; 正文产品概述部署简易性步…

使用免费软件将数据从机械硬盘克隆到固态硬盘!

正如大家所知道的那样&#xff0c;固态硬盘无论是在读写速度、功耗、噪声还是在耐用性等许多方面都比机械硬盘要更好&#xff0c;所以现在有越来越多的人想要使用升级硬盘&#xff0c;将自己的旧机械硬盘克隆到固态硬盘&#xff0c;从而优化计算机的性能。 目前市面上…

1、Elasticsearch 8.X 概述与安装

第1章 Elasticsearch 8.X 概述 1.1 Elasticsearch 8.X 距 2019 年 Elasticsearch 上一大版本 7.0 发布至今已经过去了 3 年。2022 年 2 月 11 日&#xff0c;Elasticsearch 发布了全新的 8.0 正式版本&#xff0c;这着实给了我们不 小的惊喜&#xff01;新版本中通过改进 Elas…

局域网点歌系统

网盘下载 1、先打开服务端&#xff0c;设置好IP地址 2、客户端打开连接服务器 3、客户端点歌&#xff0c;服务器即可播放

【RV1103】RTL8723bs (SD卡形状模块)驱动开发

文章目录 前言硬件分析Luckfox Pico的SD卡接口硬件原理图LicheePi zero WiFiBT模块总结 正文Kernel WiFi驱动支持Kernel 设备树支持修改一&#xff1a;修改二&#xff1a; SDK全局配置支持 wifi全局编译脚本支持编译逻辑拷贝rtl8723bs的固件到文件系统的固定目录里面去 上电后手…

jvs-rules(规则引擎)和jvs智能bi(自助式数据分析)9.22更新内容

规则引擎更新功能 新增: 1.新增节点匹配筛选 用于做多个条件的数据筛选&#xff0c;以便将符合条件的数据传递给下一个节点进行处理&#xff0c;通常用于实现复杂的查询逻辑。 2.复合变量节点新增判断条件选项说明 用户可以根据自己的需求&#xff0c;为复合变量节点添加不…

深入学习计算机组成原理文章体系

大家好&#xff0c;欢迎阅读《计算机组成原理》的系列文章&#xff0c;本系列文章主要教内容是从零学习计算机组成原理&#xff0c;内容通俗易懂&#xff0c;大家好好学习吧&#xff01;&#xff01;&#xff01; 更多的优质内容&#xff0c;请点击以下链接查看哦~~ 序号链接…

Java深入理解线程的三大特性

目录 1 CPU缓存导致可见性问题2 线程切换导致原子性问题3 性能优化导致有序性问题4 JMM(Java Memory Model)5 volatile6 synchronized 1 CPU缓存导致可见性问题 线程的三大特性&#xff1a; 可见性&#xff1a;Visibility有序性&#xff1a;Ordering原子性&#xff1a;Atomic…

ShapeableImageView 不只是圆形ImageView

偶然间看到了这位老哥的 https://juejin.cn/post/6869376452040196109#comment 文章&#xff0c;发现了ShapeableImageView–一个多形状的ImageView &#xff0c;虽然似乎发布了很久了&#xff0c;现在学习不晚。 效果图 布局文件 <com.google.android.material.imageview.S…

图形处理软件Photoshop Elements 2020 mac中文版 ps简化版

Photoshop Elements 2020 mac是一款非常实用的图形处理工具。ps elements 2020 mac中文版可以帮助您自动生成照片和视频作品的功能&#xff0c;采用Adobe Sensei AI技术可进行图像组织、编辑和创建等。Photoshop Elements 2020 for Mac激活版可以帮助您轻松整理照片和视频&…

【LeetCode热题100】--189.轮转数组

189.轮转数组 数组翻转&#xff1a; 当我们将数组的元素向右移动k次后&#xff0c;尾部k mod n个元素会移动至数组 头部&#xff0c;其余元素向后移动k mod n个位置 该方法为数组的翻转&#xff1a;我们可以先将所有元素翻转&#xff0c;这样尾部k mod n个元素就被移至数组头…

ROS2 从头开始:第 08/8回 - 使用 ROS2 生命周期节点简化机器人软件组件管理

一、说明 欢迎来到我在 ROS2 上的系列的第八部分。对于那些可能不熟悉该系列的人,我已经涵盖了一系列主题,包括 ROS2 简介、如何创建发布者和订阅者、自定义消息和服务创建、

医学影像SAM

医学影像SAM 1. 医学影像SAM1.1. MedSAM1.2. SAM-Adapter1.3. Medical-SAM-Adapter1.4. sam-med2d1.5. MS-SAM 下面整理了一些比较好的博客。 1. 医学影像SAM 由于sam在医学影像上表现不是特别好&#xff0c;在该类型数据集上就需要再训练。 1.1. MedSAM MedSAM&#xff1a…

WebGL绘制圆形的点

目录 前言 如何实现圆形的点&#xff1f; 片元着色器内置变量&#xff08;gl_FragCoord、gl_PointCoord&#xff09; gl_PointCoord的含义 示例程序&#xff08;RoundedPoint.js&#xff09; 代码详解 前言 本文将讨论示例程序RoundedPoint&#xff0c;该程序绘制了圆…

Tomcat 开启远程调试

Tomcat 部署的 war包工程开启远程调试 Linux服务器下&#xff0c;编辑Tomcat bin 目录下的 startup.sh 文件 vim startup.sh在第一行加入&#xff1a;(不换行&#xff0c;在同一行) declare -x CATALINA_OPTS"-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:…

vue3+eleement plus日历选择季度

<template><div class"el-quarter-wrap"><el-popover width"280" v-model"visible"><template #reference><el-input v-model"quarterDate" placeholder"请选择季度" clearable :prefix-icon&qu…