JDK 21 的新特性有哪些?带你全面解读 Java 的未来
引言:从 JDK 21 看 Java 的进化之路
Java 是一门历久弥新的语言,每一次版本更新都在强化它的生态体系。2023 年发布的 JDK 21,作为长期支持版本(LTS),带来了许多令人兴奋的新特性。不论你是开发者、架构师还是技术爱好者,这些新功能都能帮助你写出更高效、更优雅的代码。
本文将带你全面解析 JDK 21 的主要新特性,并通过实际案例帮助你快速上手。
一、面向未来的增强:主要新特性概览
1. Virtual Threads(虚拟线程,正式版)
虚拟线程 是 JDK 21 最重要的特性之一,它彻底革新了 Java 的并发模型。传统线程(OS Thread)开销大,数量有限,而虚拟线程则是轻量级线程,调度由 JVM 管理,支持数百万级并发。
核心特性:
- 每个任务一个虚拟线程,避免线程池的复杂管理。
- 线程创建成本极低。
- 与传统线程完全兼容。
代码示例:
public class VirtualThreadDemo {public static void main(String[] args) {try (var executor = Thread.ofVirtual().factory().newThreadExecutor()) {executor.submit(() -> {System.out.println("Hello from Virtual Thread: " + Thread.currentThread());});}}
}
亮点:
- 减少资源浪费,提升服务器性能。
- 简化并发编程模型,更关注业务逻辑。
2. Scoped Values(范围值,预览版)
Scoped Values 是一种新的共享数据传递方式,用于替代 ThreadLocal,但更加安全和高效。
适用场景:
- 为子线程传递上下文数据(特别适合虚拟线程)。
- 避免使用
ThreadLocal带来的内存泄漏问题。
代码示例:
import jdk.incubator.concurrent.ScopedValue;public class ScopedValueDemo {private static final ScopedValue<String> USER_ID = ScopedValue.newInstance();public static void main(String[] args) {ScopedValue.where(USER_ID, "User123").run(() -> {System.out.println("Current User ID: " + USER_ID.get());});}
}
3. Pattern Matching(模式匹配,正式版)
Java 的 模式匹配 在 JDK 21 迎来了正式版,增强了 switch 和 instanceof 的能力。
代码示例:模式匹配增强的 switch
public static String describe(Object obj) {return switch (obj) {case Integer i -> "It's an Integer: " + i;case String s -> "It's a String: " + s;case null -> "It's null";default -> "Unknown type";};
}
亮点:
- 减少冗长的类型检查代码。
- 更加类型安全和语义清晰。
4. Record Patterns(记录模式,正式版)
记录模式允许在模式匹配中解构 Record 类型,进一步增强了 Java 的表达能力。
代码示例:解构 Record
record Point(int x, int y) {}public static String describe(Point p) {return switch (p) {case Point(int x, int y) when x > 0 && y > 0 -> "Point is in the first quadrant";default -> "Point is not in the first quadrant";};
}
5. Unnamed Classes 和 Instance Main 方法(预览版)
JDK 21 引入了一种快速编写简单 Java 应用的能力,支持匿名类和简化的 main 方法,特别适合教学场景或临时代码。
代码示例:快速编写临时代码
// No need to define a class explicitly
public static void main() {System.out.println("Hello, Java 21!");
}
二、性能优化与底层增强
1. String Templates(字符串模板,预览版)
字符串模板让字符串插值更简单,更安全,提升了代码的可读性。
代码示例:字符串模板
String name = "Alice";
int age = 25;String template = STR."My name is {name}, and I am {age} years old.";
System.out.println(template);
2. Foreign Function & Memory API(正式版)
JDK 21 中,FFM API 正式发布,用于更安全高效地调用本地代码和管理内存。
代码示例:读取本地内存数据
import java.lang.foreign.*;public class FFMExample {public static void main(String[] args) {try (MemorySegment segment = MemorySegment.allocateNative(100)) {MemoryAccess.setByteAtOffset(segment, 0, (byte) 42);System.out.println("Value: " + MemoryAccess.getByteAtOffset(segment, 0));}}
}
三、开发体验提升
1. 第三阶段的 Valhalla 项目
JDK 21 推进了 Valhalla 项目,增加对 值类型 的支持。这为未来的性能优化和内存管理奠定了基础,虽然目前仍在早期阶段,但已经初露端倪。
四、如何拥抱 JDK 21
- 升级工具链:确保你的 IDE(如 IntelliJ IDEA 或 Eclipse)和构建工具(如 Maven 或 Gradle)支持 JDK 21。
- 逐步引入特性:从非破坏性特性(如虚拟线程、模式匹配)开始试用。
- 关注社区生态:跟踪 JDK 21 的更新文档,了解其对主流框架(如 Spring、Hibernate)的支持情况。
五、总结:从 JDK 21 看 Java 的未来
JDK 21 的更新不仅让 Java 更现代化、更高效,同时也为开发者提供了更多工具去编写优雅的代码。从虚拟线程到字符串模板,再到模式匹配的全面增强,Java 正以更快的步伐追赶时代。
如果你还在使用旧版本的 Java,JDK 21 绝对值得尝试!它不仅提升了开发体验,更为未来的 Java 应用奠定了坚实的基础。
推荐阅读文章
-
由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
-
如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
-
HTTP、HTTPS、Cookie 和 Session 之间的关系
-
什么是 Cookie?简单介绍与使用方法
-
什么是 Session?如何应用?
-
使用 Spring 框架构建 MVC 应用程序:初学者教程
-
有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
-
如何理解应用 Java 多线程与并发编程?
-
把握Java泛型的艺术:协变、逆变与不可变性一网打尽
-
Java Spring 中常用的 @PostConstruct 注解使用总结
-
如何理解线程安全这个概念?
-
理解 Java 桥接方法
-
Spring 整合嵌入式 Tomcat 容器
-
Tomcat 如何加载 SpringMVC 组件
-
“在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”
-
“避免序列化灾难:掌握实现 Serializable 的真相!(二)”
-
如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
-
解密 Redis:如何通过 IO 多路复用征服高并发挑战!
-
线程 vs 虚拟线程:深入理解及区别
-
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
-
10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
-
“打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
-
Java 中消除 If-else 技巧总结
-
线程池的核心参数配置(仅供参考)
-
【人工智能】聊聊Transformer,深度学习的一股清流(13)
-
Java 枚举的几个常用技巧,你可以试着用用
-
由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
-
如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
-
HTTP、HTTPS、Cookie 和 Session 之间的关系
-
使用 Spring 框架构建 MVC 应用程序:初学者教程
-
有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
-
Java Spring 中常用的 @PostConstruct 注解使用总结
-
线程 vs 虚拟线程:深入理解及区别
-
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
-
10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
-
探索 Lombok 的 @Builder 和 @SuperBuilder:避坑指南(一)
-
为什么用了 @Builder 反而报错?深入理解 Lombok 的“暗坑”与解决方案(二)
相关文章:
JDK 21 的新特性有哪些?带你全面解读 Java 的未来
引言:从 JDK 21 看 Java 的进化之路 Java 是一门历久弥新的语言,每一次版本更新都在强化它的生态体系。2023 年发布的 JDK 21,作为长期支持版本(LTS),带来了许多令人兴奋的新特性。不论你是开发者、架构师…...
【C++算法】53.链表_重排链表
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 143. 重排链表 题目描述: 解法 模拟 找到链表的中间节点 快慢双指针 把后面的部分逆序 双指针,三指针,头插法 合并两个链表 合并两个有…...
多卡分布式训练:torchrun --nproc_per_node=5
多卡分布式训练:torchrun --nproc_per_node=5 1. torchrun 实现规则 torchrun 是 PyTorch 提供的用于启动分布式训练作业的实用工具,它基于 torch.distributed 包,核心目标是简化多进程分布式训练的启动和管理。以下是其主要实现规则: 进程启动 多进程创建:torchrun 会…...
系统架构设计师之系统设计模块笔记
一、系统设计概述 定义与目标 系统设计是根据系统分析结果,制定系统构建蓝图的过程,核心目标是合理分配功能需求、优化资源使用、确保系统高内聚低耦合,并满足性能、安全、可扩展等非功能需求。主要内容 概要设计:将功能需求分配…...
Elasticsearch:加快 HNSW 图的合并速度
作者:来自 Elastic Thomas Veasey 及 Mayya Sharipova 过去,我们曾讨论过搜索多个 HNSW 图时所面临的一些挑战,以及我们是如何缓解这些问题的。当时,我们也提到了一些计划中的改进措施。本文正是这项工作的成果汇总。 你可能会问…...
图片中文字无法正确显示的解决方案
图片中文字无法正确显示的解决方案 问题描述 在 Linux 系统中生成图片时,图片中的文字(如中文)未能正确显示,可能表现为乱码或空白。这通常是由于系统缺少对应的字体文件(如宋体/SimSun),或者…...
数据结构:通俗解释AOE 网中事件的最早发生时间和最迟发生时间
1. 事件的最早发生时间 在 AOE 网(Activity On Edge Network,边表示活动的网络)中,事件的最早发生时间指从源点(起点)到该事件结点的最长路径长度(即所需时间)。它决定了所有以该事…...
C# 看门狗策略实现
using System; using System.Threading;public class Watchdog {private Timer _timer;private volatile bool _isTaskAlive;private readonly object _lock new object();private const int CheckInterval 5000; // 5秒检测一次private const int TimeoutThreshold 10000; …...
在 openEuler 24.03 (LTS) 操作系统上添加 ollama 作为系统服务的步骤
以下是在 openEuler 操作系统上添加 ollama 作为系统服务的步骤: 创建 systemd 服务文件 sudo vi /etc/systemd/system/ollama.service将以下内容写入服务文件(按需修改参数): [Unit] DescriptionOllama Service Afternetwork.…...
Elasticsearch中的基本全文搜索和过滤
Elasticsearch中的基本全文搜索和过滤 知识点参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-filter-tutorial.html#full-text-filter-tutorial-range-query 1. 索引设计与映射 多字段类型(Multi-Fields) ÿ…...
基于VSCode的Qt开发‘#include ui_test.h’报错没有该文件
笔者在基于VSCode进行Qt开发时,test.ui文件是在Qt软件中绘制的,导致本项目无法使用这个ui文件,报错如标题。事实上,本工程中也确实没有生成这个头文件。出现这个错误的原因是ui文件没有被编译为c头文件。 要生成 ui_test.h 文件&…...
Python常用排序算法
1. 冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的元素,如果他们的顺序错误就交换他们。 def bubble_sort(arr):# 遍历所有数组元素for i in range(len(arr)):# 最后i个元素是已经排序好的for j in range(0, …...
ISP--Demosaicking
文章目录 前言算法解释简单的线性插值代码实现 色差法和色比法基于方向加权的方法RB缺失的G通道的插值RB缺失的BR的插值G缺失的BR的插值代码实现 基于边缘检测的方法计算缺失的G计算缺失的RB值/计算缺失的G值 前言 人眼之所以有能感受到自然界的颜色,是因为人眼的感…...
国标GB28181协议EasyCVR视频融合平台:5G时代远程监控赋能通信基站安全管理
一、背景介绍 随着移动通信行业的迅速发展,无人值守的通信基站建设规模不断扩大。这些基站大多建于偏远地区,周边人迹罕至、交通不便,给日常的维护带来了极大挑战。其中,位于空旷地带的基站设备,如空调、蓄电池等&…...
vue watch 和 watchEffect的区别和用法
在 Vue.js 里,watch 和 watchEffect 都用于响应式地追踪数据变化并执行相应操作,不过它们在使用方式、应用场景等方面存在差异。 1. watch watch 是 Vue 提供的一个选项,用于监听特定数据的变化。当监听的数据发生变化时,会触发…...
SQL 不走索引的常见情况
在 SQL 查询中,即使表上有索引,某些情况下数据库优化器也可能决定不使用索引。以下是常见的不走索引的情况: 1. 使用否定操作符 NOT IN ! 或 <> NOT EXISTS NOT LIKE 2. 对索引列使用函数或运算 -- 不走索引 SELECT * FROM user…...
git配置 gitcode -- windows 系统
版本 $ git --version git version 2.49.0.windows.1检查现有的 SSH 密钥 打开git-bash终端,执行以下命令查看是否已经生成过 SSH 密钥: ls -al ~/.ssh如果看到类似 id_rsa 和 id_rsa.pub(或者其他命名的密钥对)文件࿰…...
基于Kubeadm实现K8S集群扩缩容指南
一、集群缩容操作流程 1.1 缩容核心步骤 驱逐节点上的Pod 执行kubectl drain命令驱逐节点上的Pod,并忽略DaemonSet管理的Pod: kubectl drain <节点名> --ignore-daemonsets # 示例:驱逐worker233节点 kubectl drain worker233 --ignor…...
模拟-与-现实协同训练:基于视觉机器人操控的简单方法
25年3月来自 UT Austin、Nvidia、UC Berkeley 和纽约大学的论文“Sim-and-Real Co-Training: A Simple Recipe for Vision-Based Robotic Manipulation”。 大型现实世界机器人数据集在训练通才机器人模型方面拥有巨大潜力,但扩展现实世界人类数据收集既耗时又耗资…...
WRS-PHM电机智能安康系统:为浙江某橡胶厂构筑坚实的生产防线
以行业工况为背景 一、顾客工厂的背景 浙江某橡胶厂以电机为中心生产设备必须连续平稳运行。但由于缺乏有效的故障预警体系,电机故障就像潜伏着的“不定时炸弹”,不但不时地造成生产流程的中断,也使对生产进行管理异常艰难,对持续安全生产提…...
将 CrewAI 与 Elasticsearch 结合使用
作者:来自 Elastic Jeffrey Rengifo 学习如何使用 CrewAI 为你的代理团队创建一个 Elasticsearch 代理,并执行市场调研任务。 CrewAI 是一个用于编排代理的框架,它通过角色扮演的方式让多个代理协同完成复杂任务。 如果你想了解更多关于代理…...
wait 和notify ,notifyAll,sleep
wait 使线程进入阻塞状态,释放CPU,以及锁 sleep 使线程进入睡眠状态,sleep方法不会释放CPU资源和锁资源,而是让出CPU的使用权。操作系统会将CPU分配给其他就绪线程,但当前线程依然存在,不会释放其占用的…...
ECMAScript 6 新特性(二)
ECMAScript 6 新特性(二) ECMAScript 6 新特性(一) ECMAScript 6 新特性(二)(本文) ECMAScript 7~10 新特性 1. 生成器 生成器函数是 ES6 提供的一种解决异步编程方案,一…...
SpringBoot接口覆盖上一次调用的实现方案
调用springboot接口时,如何实现覆盖上一次调用 Spring Boot 接口覆盖上一次调用的实现方案 以下是多种实现覆盖上一次接口调用的方案,适用于不同场景。 方案一:同步锁控制(单机环境) 适用场景:单实例…...
Spring 的 IoC 和 DI 详解:从零开始理解与实践
Spring 的 IoC和 DI 详解:从零开始理解与实践 一、IoC(控制反转) 1、什么是 IoC? IoC 是一种设计思想,它的核心是将对象的创建和管理权从开发者手中转移到外部容器(如 Spring 容器)。通过这种…...
Python Cookbook-5.12 检查序列的成员
任务 你需要对一个列表执行很频繁的成员资格检査。而in操作符的 O(n)时间复杂度对性能的影响很大,你也不能将序列转化为一个字典或者集合,因为你还需要保留原序列的元素顺序。 解决方案 假设需要给列表添加一个在该列表中不存在的元素。一个可行的方法…...
签名过期怎么办?
1无论是证书到期还是被封停,只需要找到签名服务商,重新签名就可以了,但签名经常性过期会造成app用户流失,所以我们在选择签名时需要注意,在资金充足的情况下,优先选择独立、稳定签名,接下来我们…...
ZYNQ笔记(四):AXI GPIO
版本:Vivado2020.2(Vitis) 任务:使用 AXI GPIO IP 核实现按键 KEY 控制 LED 亮灭(两个都在PL端) 一、介绍 AXI GPIO (Advanced eXtensible Interface General Purpose Input/Output) 是 Xilinx 提供的一个可…...
实操(环境变量)Linux
环境变量概念 我们用语言写的文件编好后变成了程序,./ 运行的时候他就会变成一个进程被操作系统调度并运行,运行完毕进程相关资源被释放,因为它是一个bash的子进程,所以它退出之后进入僵尸状态,bash回收他的退出结果&…...
【补题】P9423 [蓝桥杯 2023 国 B] 数三角
题意:小明在二维坐标系中放置了 n 个点,他想在其中选出一个包含三个点的子集,这三个点能组成三角形。然而这样的方案太多了,他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选法可以组成等腰三角形ÿ…...
