Java21新增特性

news/2025/2/14 6:00:38/

在这里插入图片描述

版本介绍

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.ppmy.cn/news/1228383.html

相关文章

函数式编程框架 functionaljava 简介

文章目录 一、函数式编程起源二、functionaljava 框架简介 一、函数式编程起源 ​ 函数式编程起源于数理逻辑(范畴论,Category Theory),起源于λ演算,这是一种演算法,它定义一些基础的数据结构&#xff0c…

C练习题_13

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上 以下叙述不正确的是()。 A.C程序中,语句之间必须用分号分…

GitHub如何删除仓库

GitHub如何删除仓库 删除方法第一步第二步第三步 删除方法 第一步 在仓库的界面选择Settings 第二步 选择General,页面拉到最后。 第三步 后续按照导向删除仓库即可。

SOME/IP 协议介绍(六)接口设计的兼容性规则

接口设计的兼容性规则(信息性) 对于所有序列化格式而言,向较新的服务接口的迁移有一定的限制。使用一组兼容性规则,SOME / IP允许服务接口的演进。可以以非破坏性的方式进行以下添加和增强: • 向服务中添加新方法 …

Flume的安装部署及常见问题解决

1.安装地址 (1) Flume官网地址:http://flume.apache.org/ (2)文档查看地址:http://flume.apache.org/FlumeUserGuide.html (3)下载地址:http://archive.apache.org/dist…

npm私有云

安装node时npm会自动安装,npm也可以单独安装。 package.json 在使用npm时,package.json文件是非常重要的,因为它包含了关于项目的必要信息,比如名称、版本、依赖项等。在初始化新项目时,通常会使用npm init命令生成一…

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十四)

介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…

基于PHP+MySql的酒店信息管理系统的设计与实现

一、系统开发环境 运行环境:phpstudy或者wampserver, 开发工具:vscodephpstorm 数据库:mysql 二、酒店管理系统功能 1.前台功能: 首页客房推荐,周边特色介绍 酒店在线预订 订单查询,可以…