Java21新增特性

news2024/9/23 6:56:39

在这里插入图片描述

版本介绍

Java 21是Java平台的一个新版本,于2023年9月19日由Oracle公司正式发布。这个版本包含了数千个性能、稳定性和安全性更新,以及几十个新功能和增强。其中,15个增强被赋予了自己的JDK增强提案(JEP),涵盖了六个预览功能和一个孵化器功能。

Oracle为Java 21提供了至少八年的长期支持,这使得组织能够以最小的维护成本将应用程序更长时间地保持在生产环境中,并可以按照自己的节奏进行迁移。根据客户反馈和Java生态系统中的使用情况,Oracle还宣布将Java 11的长期支持延长至至少2032年1月。

在Java 21中,许多改进和新功能都是为了提升开发者的体验和增强代码的可读性。此外,Java 21还可以帮助开发者更好地应对现实世界的挑战,比如会议安排等问题。

Oracle与OpenJDK社区中的许多个人和组织一起构建了Java 21。在已修复的24,196个JIRA问题中,有17,288个是由Oracle工作人员完成的,而6,908个是由其他组织工作人员或个人开发者贡献的。

总的来说,Java 21版本带来了许多新的功能和改进,这不仅可以提高开发者的生产力和代码质量,而且可以帮助组织更好地管理他们的应用程序和数据。

在这里插入图片描述

特性列表

Java 21的新特性包括:

  1. 虚拟线程(Virtual Threads):这是Java 21引入的轻量级线程,可以显著减少编写、维护和观察高吞吐量并发应用程序的工作量。虚拟线程的创建和调度成本低,使得编写并发应用程序变得更简单。
  2. 序列集合(Sequenced Collections):这是一种新的接口族,用于表示集合的概念,这些集合的元素按照预定义的序列或顺序排列。该特性是为了解决集合框架中缺乏预定义的顺序和统一的操作集的问题。
  3. 分代ZGC(Generational ZGC):这是在Z垃圾回收器(ZGC)的基础上通过扩展来维护年轻对象和年老对象的独立生成,从而提高应用程序性能的特性。这将使ZGC能够更频繁地收集年轻对象,这些对象往往英年早逝。
  4. 记录模式(Record Patterns):这是为了增强Java编程语言而引入的特性,用于解构记录值。可以嵌套记录模式和类型模式,以实现功能强大、声明性和可组合形式的数据导航和处理。
  5. switch 模式匹配(Switch Pattern Matching):这是通过switch表达式和语句的模式匹配来增强Java编程语言的特性。通过将模式匹配扩展到switch,可以针对多个模式测试表达式,每个模式都有一个特定的操作,从而可以简洁、安全地表达复杂的面向数据的查询。
  6. 字符串模板(String Templates):这个新特性让你可以在字符串中使用占位符,然后通过Java代码来替换这些占位符,从而生成新的字符串。这个特性可以简化字符串拼接和处理的过程。
  7. 文本块(Text Blocks):这是Java 21中引入的一种新的字符串处理机制,可以更方便地处理文本数据。使用文本块,你可以更轻松地分割、格式化和处理文本字符串。
  8. 局部变量类型推断(Local Variable Type Inference):这个新特性让你可以在声明局部变量时使用关键字"var",然后根据变量的初始值来推断其类型。这个特性可以简化变量声明的语法,使代码更简洁。
  9. ** 改进的switch语句(Improved switch statements)**:这个新特性让你可以在switch语句中使用模式匹配,可以根据表达式的值或变量的类型来执行不同的操作。这个特性可以增强switch语句的功能,使其更灵活。
  10. 私有实例字段(Private Instance Fields):这个新特性让你可以创建私有实例字段,只能被其所在类的其他方法访问。这个特性可以提高代码的安全性和可维护性。
  11. 记录类型(Record Types):这个新特性让你可以创建自定义的记录类型,可以包含多个字段和方法。这个特性可以提高代码的可读性和可维护性。
  12. 扩展注解(Extended Annotations):这个新特性让你可以创建自定义的注解,可以应用于类、方法、字段等其他元素。这个特性可以增强代码的可读性和可维护性。
  13. 改进的并发API(Improved Concurrency API):这个新特性让你可以更方便地使用并发编程技术,例如线程池和并发集合。这个特性可以提高代码的并发性能和可维护性。
  14. 改进的Streams API(Improved Streams API):这个新特性让你可以更方便地处理数据流,例如对数据进行过滤、映射和收集等操作。这个特性可以提高代码的可读性和可维护性。

在这里插入图片描述

代码示例

  • 以下是Java 21中引入的字符串模板的代码示例:
String name = "Alice";
int age = 30;

// 使用字符串模板将变量插入到字符串中
String message = "My name is ${name} and I am ${age} years old.";
System.out.println(message); // 输出 "My name is Alice and I am 30 years old."

在上面的代码中,我们使用了字符串模板来将变量"name"和"age"的值插入到字符串中。在字符串中使用"${}"来标记变量的位置,然后通过Java代码来替换这些占位符,生成新的字符串。这个特性可以简化字符串拼接和处理的过程,使代码更简洁、易读。

  • 以下是Java 21中引入的文本块的代码示例:
String text = "This is a sample text.";

// 使用文本块将字符串分割为单词
String[] words = text.split("\\s+");
System.out.println(Arrays.toString(words)); // 输出 "[This, is, a, sample, text.]"

// 使用文本块将字符串按行分割
String[] lines = text.lines().toArray(String[]::new);
System.out.println(Arrays.toString(lines)); // 输出 "[This is a sample text., This, is, a, sample, text.]"

在上面的代码中,我们使用了文本块来将字符串分割为单词和按行分割。使用文本块可以更方便地处理文本数据,例如对文本进行分割、格式化和处理等操作。这个特性可以简化字符串处理的过程,使代码更简洁、易读。

  • 以下是Java 21中引入的局部变量类型推断的代码示例:
// 使用局部变量类型推断声明变量
var name = "Alice";
var age = 30;

// 使用局部变量类型推断进行算术运算
var result = var a = 5 + 5; // a 的类型为 int
System.out.println(result); // 输出 10

在上面的代码中,我们使用了关键字"var"来声明变量,然后根据初始值来推断变量的类型。这个特性可以简化变量声明的语法,使代码更简洁。同时,我们还可以使用局部变量类型推断进行算术运算,使代码更简洁、易读。

  • 以下是Java 21中引入的改进的switch语句的代码示例:
int day = 3;

// 使用改进的switch语句根据day的值执行不同的操作
switch (day) {
    case 1 -> System.out.println("Monday");
    case 2 -> System.out.println("Tuesday");
    case 3 -> System.out.println("Wednesday");
    // 更多的case语句...
    default -> System.out.println("Another day");
}

在上面的代码中,我们使用了改进的switch语句,可以根据表达式的值或变量的类型来执行不同的操作。这个特性可以增强switch语句的功能,使其更灵活、易用。根据不同的条件执行不同的操作,可以使代码更清晰、易读。

  • 以下是Java 21中引入的记录类型(Record Types)的代码示例:
record Person(String name, int age) {
    // 记录类型的构造函数
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 记录类型的访问器方法
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

// 使用记录类型创建对象
Person person = new Person("Alice", 30);
System.out.println(person.getName()); // 输出 "Alice"
System.out.println(person.getAge()); // 输出 30

在上面的代码中,我们定义了一个名为Person的记录类型,它包含了两个字段:name和age。记录类型的构造函数用于初始化这些字段,而访问器方法用于获取字段的值。使用记录类型可以更方便地创建具有固定字段的类,使代码更简洁、易读。同时,记录类型还提供了更好的封装性和安全性,可以避免直接访问类的字段。

在这里插入图片描述

拓展

Java9新增特性

Java10新增特性

Java11新增特性

Java12新增特性

Java13新增特性

Java14新增特性

Java15新增特性

Java16新增特性

Java17新增特性

Java18新增特性

Java19新增特性

Java20新增特性

在这里插入图片描述

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

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

相关文章

回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测

回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测 目录 回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测(…

Linux系统编程 day02 vim、gcc、库的制作与使用

Linux系统编程 day02 vim、gcc、库的制作与使用 01. vim0101. 命令模式下的操作0102. 切换到文本输入模式0103. 末行模式下的操作0104. vim的配置文件 02. gcc03. 库的制作与使用0301. 静态库的制作与使用0302. 动态库(共享库)的制作与使用 01. vim vim是一个编辑器&#xff0…

微服务 Spring Cloud 7,Nacos配置中心的Pull原理,附源码

目录 一、本地配置二、配置中心1、以Nacos为例:2、Pull模式3、也可以通过Nacos实现注册中心 三、配置中心提供了哪些功能四、如何操作配置中心1、配置注册2、配置反注册3、配置查看4、配置变更订阅 五、主流的微服务注册中心有哪些,如何选择?…

在Vue关于ue的computed属性中传递参数

computed的基本用法 computed是Vue实例中一个非常强大的计算属性,它的值主要根据依赖数据而变化。我们可以将一些简单的计算放在computed属性中,从而实现在模板中使用简单的表达式。 但是实际项目中通常有这么一个场景:根据传递不一样的参数值…

pyqt designer的版本问题

之前我的电脑Windows11 python3.12上安装好了pyqt6后,安装不了pyqt6-tools,导致不能使用designer设计师服务。经过摸索,然来只需要安装qt-tools就够了。qt-tools在plugin包里。比如文章顶部的资源包,下载下来直接使用pip安装该whl…

学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程

🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;) 博主首页,更多redis、java等优质好文以及各种保姆级教程等您挖掘! 目录 前言 JetBrains全家桶介绍 申请过程: 获取学…

Appium自动化测试:通过appium的inspector功能无法启动app的原因

在打开appium-desktop程序,点击inspector功能,填写app的配置信息,启动服务提示如下: 报错信息: An unknown server-side error occurred while processing the command. Original error: Cannot start the cc.knowyo…

【NI-DAQmx入门】频率测量

1.频率概述 时域表示给出了信号在采样时刻的幅度。 频率是指循环或周期事件的复现率,对于模拟或数字波形,信号周期的倒数就是频率。快速傅立叶变换 (FFT) 提供了一种检查频域关系的方法。傅里叶定理指出,时域中的任何波形都可以用正弦和余弦的…

【Flink】窗口(Window)

窗口理解 窗口(Window)是处理无界流的关键所在。窗口可以将数据流装入大小有限的“桶”中,再对每个“桶”加以处理。 本文的重心将放在 Flink 如何进行窗口操作以及开发者如何尽可能地利用 Flink 所提供的功能。 对窗口的正确理解&#xff…

【Django-DRF用法】多年积累md笔记,第3篇:Django-DRF的序列化和反序列化详解

本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计REST API,通过使用Django来实现一个REST API为例,明确后端开发REST API要做的最核心工作,然后介绍Django REST framework能帮助我们简化开发REST API的工作。 全…

Ps:变换

可以向选区、整个图层、多个图层或图层蒙版应用变换 Transform,还可以向路径、矢量形状、矢量蒙版、选区边界或 Alpha 通道应用变换。 若要变换栅格(像素)图像,建议先将其转换为智能对象,以便进行非破坏性的变换。 Ps菜…

【Flink】核心概念:并行度与算子链

并行度(Parallelism) 当要处理的数据量非常大时,我们可以把一个算子操作,“复制”多份到多个节点,数据来了之后就可以到其中任意一个执行。这样一来,一个算子任务就被拆分成了多个并行的“子任务”&#x…

计算机毕业设计 基于SpringBoot的健身房管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解目录

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

3-docker安装centos7

CentOS7.9下安装完成docker后,后续我们可以在其上安装centos7系统。具体操作如下: 1.以root用户登录CentOS7.9服务器,拉取centos7 images 命令: docker pull centos:centos7 2.加载centos7 images并登录验证 命令:…

Linux调试器---gdb的使用

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 键盘敲烂,年薪百万! 一、gdb的背景 gdb,全称为GNU调试器(GNU Debugger),是一个功能强大的源代码级调试工具,主要…

【C++】【Opencv】霍夫直线检测即cv::HoughLinesP()函数详解和示例

cv::HoughLinesP()(函数霍夫直线)功能分析是一种用于检测图像中直线的算法,它基于霍夫变换的原理。通过该算法,我们可以从图像中提取出直线信息,从而对图像进行分析和处理。主要经理边缘检测和霍夫直线处理两个步骤。本…

【LeetCode刷题-树】--100.相同的树

100.相同的树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

C/C++统计数 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C统计数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C统计数 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定一个数的序列S,以及一个区间[L, R], 求序列…

Codeforces Round 910 (Div. 2)(D~F)

1898D - Absolute Beauty 题意:给定长度为n的数组a和b,定义b数组的价值为,现可以交换一次b数组中的任意两个元素,求b数组的价值最大值。 思路:绝对值问题可以放在数轴上去解决。绝对值即为区间长度 观察上述三种情况&…

认识.NET Aspire:高效构建云原生应用的利器

简介 在几天前的.NET 8发布会上,来自微软的Glenn Condron和David Fowler为我们演示了.NET Aspire,在Visual Studio的帮助下,它展现出了惊人的开发效率。 短短的十分钟内,David现场演示了如何轻松创建了一个具有服务发现&#xf…