Java21新增特性

在这里插入图片描述

版本介绍

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新增特性

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超详细~25考研规划~感恩现在努力的你!!!

25考研规划 俄语,翻译过来叫我爱你 考试时间 第一天 8.30-11.30政治——100分 2.00-5.00英语——100分 第二天 8.30-11.30数学——150分 2.00-5.00专业课——150分 1.什么是25考研 将在2024年12月参加考研,2025年本科毕业,9月读研究…

【Linux】第十九站:进程替换

文章目录 一、单进程版---最简单的程序替换二、进程替换的原理三、多进程的程序替换1.多进程的程序替换实例2.那么程序在替换时候有没有创建子进程呢3.再谈原理4.一个现象5.我们的CPU如何得知程序的入口地址? 四、各个接口的介绍1.execl2.execlp3.execv4.execvp5.ex…

java文件压缩加密,使用流的方式

使用net.lingala.zip4j来进行文件加密压缩。 添加依赖net.lingala.zip4j包依赖&#xff0c;这里使用的是最新的包2.11.5版本。 <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>${zip4j.versi…

某60区块链安全之不安全的随机数实战一

区块链安全 文章目录 区块链安全不安全的随机数实战一实验目的实验环境实验工具实验原理实验内容攻击过程分析合约源代码漏洞EXP利用 不安全的随机数实战一 实验目的 学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用 实验环境 Ubuntu18.04操作机 实验工…

进程之理解进程的概念

你必须非常努力&#xff0c;才能看起来毫不费力。文章目录 进程的基本概念描述进程——pcbtest_struct pcb的一种task_struct 内容分类 组织进程查看进程通过系统调用获取进程标示符总结 进程的基本概念 课本概念&#xff1a;进程是一个执行实列&#xff0c;正在执行的程序等。…

JAVA小游戏拼图

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下&#xff1a; package heima; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import …

一款实用的.NET Core加密解密工具类库

前言 在我们日常开发工作中&#xff0c;为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES&#xff0c;RSA&#xff0c;MD5&#xff0c;SAH1&#xff0c;SAH256&#xff0c;DES等&#xff0c;这时候假如我们有一个封装的对应加密解密工具类可以直接…

源码分析Mybatis拦截器(Interceptor)拦截saveBatch()获取不到实体id的原因

1.背景 由于业务需求想在Mybatis拦截器层面获取insert后实体id去做相关业务。但是发现执行saveBatch()方法时&#xff0c;获取参数实体的时候&#xff0c;拿不到自增id。但是save()方法可以。 save方法之所以可以是因为&#xff1a; MybatisPlus的BaseMapper执行insert方法后…

leetcode刷题日志-68.文本左右对齐

给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词&#xff1b;也就是说&#xff0c;尽可能多地往每行中放置单词。必要时可…

C语言:结构体

目录 结构体类型的声明 匿名结构体 全局结构体变量 嵌套结构体 访问结构体成员 结构的自引用 结构体变量的定义和初始化 结构体内存对齐 结构体内存对齐规则 修改默认对齐数 #pragma pack(n) offsetof 求结构体成员相对于结构体开头的偏移量的宏。 为什么存在内存…

JavaScript 异步编程

异步的概念 异步&#xff08;Asynchronous, async&#xff09;是与同步&#xff08;Synchronous, sync&#xff09;相对的概念。 在我们学习的传统单线程编程中&#xff0c;程序的运行是同步的&#xff08;同步不意味着所有步骤同时运行&#xff0c;而是指步骤在一个控制流序…

【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…

六大排序(插入排序、希尔排序、冒泡排序、选择排序、堆排序、快速排序)未完

文章目录 排序一、 排序的概念1.排序&#xff1a;2.稳定性&#xff1a;3.内部排序&#xff1a;4.外部排序&#xff1a; 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四、交换排序1.冒泡排序2.快速排序…

论文阅读——DiffusionDet

在目标检测上使用扩散模型 前向过程&#xff1a;真实框-->随机框 后向过程&#xff1a;随机框-->真实框 前向过程&#xff1a; 一般一张图片真实框的数目不同&#xff0c;填补到同一的N个框&#xff0c;填补方法可以是重复真实框&#xff0c;填补和图片大小一样的框&a…

Hive语法,函数--学习笔记

1&#xff0c;排序处理 1.1cluster by排序 &#xff0c;在Hive中使用order by排序时是全表扫描&#xff0c;且仅使用一个Reduce完成。 在海量数据待排序查询处理时&#xff0c;可以采用【先分桶再排序】的策略提升效率。此时&#xff0c; 就可以使用cluster by语法。 cluster…

从能用到好用,国产CPU不是你想象中的样子了?

最近看到了挺多关于国产CPU的评测视频&#xff0c;主要测试了鲲鹏、飞腾、海光、龙芯这四家。作为信创从业者&#xff0c;也想结合日常工作中接触到的国产CPU使用体验&#xff0c;发表些自己的看法。 我看到的评测&#xff0c;主要是采用SPEC CPU2006进行横向对比。SPEC CPU20…

VMware Workstation 与 Device/Credential Guard 不兼容 解决办法

问题描述 问题描述&#xff1a; VMware 启动虚拟机会报错。无法运行。 错误信息&#xff1a;VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 原因分析&#xff1a; 通常原因是 Window 系统开启了 内置的Hyper-V 虚拟机。 解决方案&…

在 Linux 上搭建 Java Web 项目环境(最简单的进行搭建)

要在 Linux 上安装的程序有 1.JDK (要想运行 java 程序 JDK 是必不可少的) 2.Tomcat &#xff08;HTTP 服务器&#xff0c;是管理 Web 项目的常用工具&#xff09; 3. mysql &#xff08;数据库&#xff09; 一.安装 JDK 博主使用的 Linux 发行版是 centos &#xff0c;cen…

【MySQL--->用户管理】

文章目录 [TOC](文章目录) 一、用户管理表二、基本操作三、用户权限分配给用户某个数据库中某个表的某个权限. grant 权限 on 库.表名 to 用户名主机名. ![在这里插入图片描述](https://img-blog.csdnimg.cn/fe8eb171ef9343c3a09bd64d4f0db5c1.png)分配给用户某个数据库中全部表…

node实战——koa实现文件上传

文章目录 ⭐前言⭐koa实现文件上传⭐foxapi测试⭐总结⭐结束⭐前言 大家好,我是yma16,本文分享关于node实战——node实战——koa实现文件上传。 本文适用对象:前端初学者转node方向,在校大学生,即将毕业的同学,计算机爱好者。 node系列往期文章 node_windows环境变量配置…