当前位置: 首页 > news >正文

Java21 新特性

文章目录

    • 1. 概述
    • 2. JDK21 安装与配置
    • 3. 新特性
      • 3.1 switch模式匹配
      • 3.2 字符串模板
      • 3.3 顺序集合
      • 3.4 记录模式(Record Patterns)
      • 3.5 未命名类和实例的main方法(预览版)
      • 3.6 虚拟线程

1. 概述


image-20230928232939153

2023年9月19日 ,Oracle 发布了 JDK21,是自 JDK17 之后最新的 LTS 版本(long-term support,长期支持版)。LTS版本一般每两年发布一个,JDK目前的LTS版本有:JDK8 , JDK11 , JDK17 ,JDK21。

Java21新特性:( oracle jdk、openjdk文档)

  • 字符串模板(预览版)
  • 虚拟线程(在JDK19中是预览版,在JDK21中是正式版,会大大改变多线程的编程风格和解决问题的方式)
  • 顺序集合(JDK21引入了SequencedCollection、SequencedSet 、SequencedMap 接口,这些接口提供了在集合开头或结尾处添加、修改或删除元素的方法,以及反转集合的功能)
  • 分代ZGC(属于JVM层面的功能)
  • 记录模式
  • switch的模式匹配
  • 未命名模式和变量(预览版)
  • 未命名类和实例的main方法(预览版)
  • 作用域值(预览版)
  • 矢量API(第六个孵化器)
  • 弃用Windows32位x86端口
  • 禁止代理的动态加载
  • 密钥封装机制的API(引入密钥封装机制 (KEM) 的 API,是一种使用公钥加密来保护对称密钥的加密技术)
  • 结构化并发(预览版, 简化并发编程)
  • 外部函数与内存API(第三次预览版)

2. JDK21 安装与配置


Oracle JDK21 官网下载地址:https://www.oracle.com/java/technologies/downloads/#java21

1、下载 windows 版 oracle jdk,下载地址:https://download.oracle.com/java/21/latest/jdk-21_windows-x64_bin.exe

image-20230928215820796

2、双击刚刚下载好的jdk安装包,进行安装:

image-20230928220157286

image-20230928220338493

image-20230928220503653

3、配置环境变量,在系统变量path中创建新的变量值,变量值的内容就是dk21的安装位置:(偷懒了😈)

系统变量变量值
PathD:\Program Files\Environment\Java\jdk-21

3. 新特性


3.1 switch模式匹配

在Java8中switch可以处理的数据类型有:byte、short、char、int、String、Enum。

而在Java21中switch可以处理更多的类型,会根据类型进行匹配,switch增强版语法如下:

switch(object){case 普通类型 变量名 [when 条件] -> ...; //通过when关键字可以进行条件筛选,[]表示可选语法     case record 类型 变量名 -> ...; // record 记录case enum 类型 变量名 -> ...;case null -> ...;case default -> ...;
}

示例:

package cn.z3inc.jdk21;import java.time.LocalDate;/*** switch 模式匹配** @author 白豆五* @date 2023/9/29* @since JDK21*/
public class SwitchTest {public static void main(String[] args) {test1(new A("HUAWEI Mate 60 Pro"));test2(new B("遥遥领先"));test2(null);test3();}/*** 根据不同的类型去做不同的事情 (jdk21之前的写法)** @param obj 入参的类型*/static void test1(Object obj) {if (obj instanceof A a) { //instanceof 的模式匹配(Java14的新语法,老版本需要强转)System.out.println("类型A===" + a.name);} else if (obj instanceof B b) {System.out.println("类型B===" + b.title);}}/*** 根据不同的类型去做不同的事情 (jdk21:switch的新语法)** @param obj 入参的类型*/static void test2(Object obj) {switch (obj) {//  case 数据类型 变量名 -> 表达式;case A a -> System.out.println("类型A===" + a.name);case B b -> System.out.println("类型B===" + b.title);// case null -> System.out.println("null");// default -> System.out.println("其他类型");case null, default -> System.out.println("其他类型或null"); // 合并写法}}// 静态内部类Astatic class A {String name;public A(String name) {this.name = name;}}// 静态内部类Bstatic class B {String title;public B(String title) {this.title = title;}}/*** 输出当前日期格式为"yyyy-MM-dd"*/static void test3() {LocalDate date = LocalDate.now();System.out.println("date = " + date);String formatted = switch (date.getDayOfWeek()) {case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "工作日";case SATURDAY, SUNDAY -> "周末";};System.out.println(formatted);}
}

image-20230929165020274


3.2 字符串模板

在Java21之前拼接字符串的写法如下:

方式1:使用 + 拼接字符串

String x = "world"String s = "hello" + x + "Java21!";

方式2:使用StringBuilder拼接字符串

String s = new StringBuilder().append("Hello").append(" ").append("World!").toString();

方式3:使用String的format()或formatted()方法,格式化字符串(有点像c语言的写法)

String name = "旺财";
int age = 18;
char sex = '男';
// 1. String.format():用于格式化字符串
// 参数1: 一个字符串模板 里面包含占位符%xxx"
// 参数2: 替换的值 可变参数
String s = String.format("姓名 %s,年龄 %d,性别 %c", name, age, sex);
System.out.println(s); // 姓名 旺财,年龄 18,性别 男// 2. String.formatted()是Java15新特性,与String.format()功能一样
s = "姓名 %s,年龄 %d,性别 %c".formatted(name, age, sex);
System.out.println(s); // 姓名 旺财,年龄 18,性别 男/*占位符:%s字符串  %d整数  %f浮点数  %c字符  %b布尔值  %t时间%e科学计数法  %x十六进制  %o八进制  %h哈希码  %n换行*/

在Java21中引入字符串模板,在字符串模板中允许在字符串中插入变量或表达式,而无需使用运算符 “+” 拼接字符串,这样可以使字符串拼接操作更加直观和方便。

STR模板处理器:STR是Java平台中的一种模板处理器,用于执行字符串的插值处理。通过STR可以将模板中的占位符或表达式动态替换为对应的值,生成最终的字符串输出。

STR是一个公共静态final字段,会自动导入到每个Java源文件中。

示例:字符串模板快速入门

String s1 = "hello";
String s2 = "world";
String target = STR."\{s1} \{s2}!"; //在字符串模板中使用`\{}`来引用变量
System.out.println(target); // hello world!
target = STR."\{s2}\{s1}";
System.out.println(target);// worldhello

示例:打印99乘法表

package cn.z3inc.jdk21;import static java.lang.StringTemplate.STR;public class StringTemplateTest {public static void main(String[] args) {for (int i = 1; i < 10; i++) {for (int j = 1; j < 10; j++) {if (j > i) {break;}System.out.print(STR."\{j} * \{i} = \{i * j} \t");}System.out.println();}}
}

image-20230929210618078

示例:字符串中嵌入表达式(模板嵌套多了就不太直观了,可以分开写,拒绝套娃😉)

package cn.z3inc.jdk21;import static java.lang.StringTemplate.STR;public class StringTemplateTest {public static void main(String[] args) {String name = "白豆五";String str = STR. "\{isNotBlank(name) ? STR. "\{ name }签到成功" : "签到失败"} " ;System.out.println(str); //白豆五签到成功 }/*** 字符串非空判断** @return 空串返回fale,否则返回true*/public static boolean isNotBlank(String str) {return !(str == null || str.length() == 0);}
}

示例:多行模板表达式(类似python中的多行字符串输出)

package cn.z3inc.jdk21;import static java.lang.StringTemplate.STR;public class StringTemplateTest {public static void main(String[] args) {String title = "假装404";String text = "Hello, world";// 3个双引号代表多行字符串String html = STR. """<html><head><title>\{ title }</title></head><body><p>\{ text }</p></body></html>""" ;System.out.println(html);}
}

image-20230929213801890


3.3 顺序集合

Sequenced Collections

在Java21中引入了全新的SequencedCollection、SequencedSet 、SequencedMap 接口,来表示顺序集合,这些接口提供了在集合开头或结尾处添加、修改或删除元素的方法,以及反转集合的功能。

image-20230929235818750

image-20230929235731060

image-20230929235949547

Java21集合体系结构:

image-20230930002211812

示例:

package cn.z3inc.jdk21;
import java.util.ArrayList;
import java.util.SequencedCollection;public class SequencedCollectionsTest {public static void main(String[] args) {SequencedCollection<String> list = new ArrayList<>();list.add("b");list.addLast("c");list.addFirst("a");// 倒序遍历for (String s : list.reversed()) {System.out.println(s);}}
}

image-20230930004113685


3.4 记录模式(Record Patterns)

类似JS中的对象参数解构赋值,把Java中的Record对象拆解成多个变量。

Record类适用场景:

  • 作为数据载体,如 DTO,VO等
  • 相对于属性可变的普通pojo,Record对象更适合函数式编程。

示例:Record 快速入门

package cn.z3inc.jdk21;//  老师类 record类型
public record Teacher(String name, int age) {  
}/*
//record类的源码:
public final class Teacher extends java.lang.Record {// 字段初始化后不可变private final String name;private final int age;// 带参构造器public Teacher(String name, int age) {this.name = name;this.age = age;}//提供两个get方法public String name() {return name;}public int age() {return age;}@Overridepublic boolean equals(Object obj) {if (obj == this) return true;if (obj == null || obj.getClass() != this.getClass()) return false;var that = (Teacher) obj;return Objects.equals(this.name, that.name) &&this.age == that.age;}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic String toString() {return "Teacher[" +"name=" + name + ", " +"age=" + age + ']';}
}*/
package cn.z3inc.jdk21;/*** 测试 记录模式* @author 白豆五* @date 2023/9/30* @since JDK21*/
public class RecordTest {public static void main(String[] args) {Teacher teacher = new Teacher("张三", 18);System.out.println(teacher);System.out.println("name:"+teacher.name());System.out.println("age:"+teacher.age());System.out.println("equals:"+teacher.equals(new Teacher("张三", 18)));System.out.println("hashCode:"+teacher.hashCode());System.out.println("toString:"+teacher.toString());}
}

image-20230930012706946

示例2:

package cn.z3inc.jdk21;// 老师类 记录类型
public record Teacher(String name, int age) {  
}
package cn.z3inc.jdk21;import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** 需求: 把老师数据转成java对象,保留20岁以上的老师,姓相同的分到一组** @author 白豆五* @date 2023/9/30* @since JDK21*/
public class RecordTest2 {public static void main(String[] args) {// 1. 模拟excel表格数据String cvs = """张三,23李四,20王五,19赵六,18张富贵,22李狗蛋,15                                         """;// 2. 按行切割字符串String[] splitArr = cvs.split("\n");// 3. 通过stream流处理数据Map<Character, List<Teacher>> map = Arrays.stream(splitArr)// 3.1. 把每一行数据转成Teacher对象.map(line -> {String[] split = line.split(",");return new Teacher(split[0], Integer.parseInt(split[1]));})// 3.2. 过滤掉年龄小于20岁的老师.filter(teacher -> teacher.age() >= 20)// 3.3. 按姓氏分组.collect(Collectors.groupingBy(teacher -> teacher.name().charAt(0)));System.out.println(map);}
}

image-20230930015837853

示例3:

package cn.z3inc.jdk21;/*** 测试 记录模式* @author 白豆五* @date 2023/9/30* @since JDK21*/
public class RecordTest3 {public static void main(String[] args) {print2(new Teacher("张三", 23));}/*** 传统方式写法** @param o*/@Deprecatedstatic void print(Object o) {if (o instanceof Teacher) {Teacher t = (Teacher) o;System.out.println("name:" + t.name() + " ,age:" + t.age());}}/*** 记录模式写法* @param o*/static void print2(Object o) {if (o instanceof Teacher(String name, int age)) { //解构记录对象中的值System.out.println("name:" + name + " ,age:" + age);}}
}

image-20230930021423829


3.5 未命名类和实例的main方法(预览版)

可以写类名,也可以不写类名。

image-20230930022047663

编译:

javac --release 21 --enable-preview MainTest.java

image-20230930022552725

运行:

java --enable-preview MainTest

image-20230930022958540


3.6 虚拟线程


todo

相关文章:

Java21 新特性

文章目录 1. 概述2. JDK21 安装与配置3. 新特性3.1 switch模式匹配3.2 字符串模板3.3 顺序集合3.4 记录模式&#xff08;Record Patterns&#xff09;3.5 未命名类和实例的main方法&#xff08;预览版&#xff09;3.6 虚拟线程 1. 概述 2023年9月19日 &#xff0c;Oracle 发布了…...

Rest Template 使用

大家好我是苏麟 今天带来Rest Template . spring框架中可以用restTemplate来发送http连接请求, 优点就是方便. Rest Template 使用 Rest Template 使用步骤 /*** RestTemple:* 1.创建RestTemple类并交给IOC容器管理* 2. 发送http请求的类*/ 1.注册RestTemplate对象 SpringB…...

IDEA git操作技巧大全,持续更新中

作者简介 目录 1.创建新项目 2.推拉代码 3.状态标识 5.cherry pick 6.revert 7.squash 8.版本回退 9.合并冲突 1.创建新项目 首先我们在GitHub上创建一个新的项目&#xff0c;然后将这个空项目拉到本地&#xff0c;在本地搭建起一个maven项目的骨架再推上去&#xff0…...

计算机操作系统 (王道考研)笔记(四)I/O系统

目录 1 I/O1.1 I/O 概念和分类1.1.1 I/O 定义1.1.2 I/O 分类 1.2 I/O控制器1.3 I/O 软件层次结构1.4 I/O 应用程序接口和驱动程序应用接口 1 I/O 1.1 I/O 概念和分类 1.1.1 I/O 定义 BIOS&#xff08;英文&#xff1a;Basic Input/Output System&#xff09;&#xff0c;即基…...

【Java基础】抽象类和接口的使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、抽象类抽象类概念…...

Golang的性能优化

欢迎&#xff0c;学习者们&#xff0c;来到Golang性能优化的令人兴奋的世界&#xff01;作为开发者&#xff0c;我们都努力创建高效、闪电般快速的应用程序&#xff0c;以提供出色的用户体验。在本文中&#xff0c;我们将探讨优化Golang应用程序性能的基本技巧。所以&#xff0…...

实现两栏布局的五种方式

本文节选自我的博客&#xff1a;实现两栏布局的五种方式 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是MilesChen&#xff0c;偏前端的全栈开发者。&#x1f4dd; CSDN主页&#xff1a;爱吃糖的猫&#x1f525;&#x1f4e3; 我的博客&#xff1a;爱吃糖的猫&…...

博物馆门票预约APP的设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

【AI视野·今日Robot 机器人论文速览 第四十四期】Fri, 29 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 29 Sep 2023 Totally 38 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;NCF,基于Neural Contact Fields神经接触场的方法实现有效的外部接触估计和插入操作。 (from FAIR ) 操作插入处理结果&am…...

一维数组和二维数组的使用(char类型)

目录 导读1. 字符数组1.1 字符数组的创建1.2 字符数组的初始化1.3 不同初始化在内存中的不同1.3.1 strlen测试1.3.2 sizeof测试1.3.3 差异原因 1.4 字符数组的使用 2. 数组越界3. 数组作为函数参数博主有话说 导读 我们在前面讲到了 int 类型的数组的创建和使用&#xff1a; 一…...

1.基本概念 进入Java的世界

1.1 Java的工作方式 1.2 Java的程序结构 类存于源文件里面&#xff0c;方法存于类中&#xff0c;语句&#xff08;statement&#xff09;存于方法中 源文件&#xff08;扩展名为.java&#xff09;带有类的定义。类用来表示程序的一个组件&#xff0c;小程序或许只会有一个类…...

程序在线报刊第一期

文章目录 程序在线报刊第一期排序算法&#xff1a;优化数据处理效率的核心技术回顾区块链技术&#xff1a;去中心化引领数字经济新时代展望AI未来&#xff1a;智能化时代的无限可能 程序在线报刊第一期 排序算法&#xff1a;优化数据处理效率的核心技术 近年来&#xff0c;随…...

k8s 拉取镜像报错 no basic auth credentials

文章目录 [toc]基于现有凭据创建 Secret通过命令行创建 Secretpod 使用指定 secret 认证私有镜像仓库 省流提醒&#xff1a; 本次解决的问题是 docker login 可以正常登录&#xff0c;docker pull 也可以正常拉取镜像&#xff0c;只是 k8s 在启动 pod 的时候&#xff0c;没有指…...

Koa处理请求数据

在开发中&#xff0c;后端接收到请求参数后&#xff0c;需要解析参数。请求分为很多种类型&#xff0c;比如常见的get和post。 请求参数 Koa本身可以解析get请求参数&#xff0c;不能解析post请求参数。例如&#xff1a; router.get(/api/get/userInfo, async (context) >…...

关于浮点数的 fld、fadd、fstp 汇编指令介绍

文章目录 FLDFADDFSTP FLD, FADD 和 FSTP 常在一起出现&#xff0c;用于 float 运算。组合实现浮点数的加载、加法运算和保存 FLD FLD 指令用于将 浮点数 从内存加载到浮点寄存器栈&#xff08;FPU Stack&#xff09;中。它的使用方式如下&#xff1a; FLD <源内存地址&g…...

知识图谱小白入门(1):neo4j的安装与CQL的使用

文章目录 序一、安装neo4j1.1 下载neo4j1.2 安装JDK1.3 BUG&#xff1a;dbms failed to start 二、CQL语法2.1 CQL语法创建节点查询节点创建关系查询关系2.2 习题 习题答案 序 知识图谱&#xff0c;是一种实体间的信息与关系知识的网状结构&#xff0c;借用图论中点与边的概念…...

一个用java的get请求

java发送一个get请求&#xff0c;请求参数classyanfa&#xff0c;使用Authorization认证&#xff0c;在Request Header里填充Authorization&#xff1a; Bearer {token}进行请求认证&#xff0c;token为&#xff1a;sadagdagdgdgfagfd ,另外在Header里补充App标识&#xff0c;X…...

作为SiteGPT替代品,HelpLook的优势是什么?

在当今快节奏的数字化世界中&#xff0c;企业不断寻求创新方式来简化运营并增强客户体验。由于聊天机器人能够自动化任务、提供快速响应并提供个性化互动&#xff0c;它们在业务运营中的使用变得非常重要。因此&#xff0c;企业越来越意识到像SiteGPT和HelpLook这样高效的聊天机…...

uni-app:实现页面效果2(canvas绘制,根据页面宽度调整元素位置)

效果 代码 <template><view><!-- 车搭配指示器-双显 --><view class"content_position"><view class"content"><view class"SN"><view class"SN_title">设备1</view><view class…...

【24种设计模式】责任链模式(Chain of Responsibility Pattern)

责任链模式是一种行为设计模式&#xff0c;它允许你将请求沿着处理链进行传递&#xff0c;直到有一个处理者能够处理该请求为止。这种模式将请求的发送者和接收者解耦&#xff0c;使多个对象都有机会处理该请求。 责任链模式的结构 责任链模式由以下几个角色组成&#xff1a;…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...