JDK 21 的新特性有哪些?带你全面解读 Java 的未来

news2025/4/18 21:15:03
引言:从 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 迎来了正式版,增强了 switchinstanceof 的能力。

代码示例:模式匹配增强的 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

  1. 升级工具链:确保你的 IDE(如 IntelliJ IDEA 或 Eclipse)和构建工具(如 Maven 或 Gradle)支持 JDK 21。
  2. 逐步引入特性:从非破坏性特性(如虚拟线程、模式匹配)开始试用。
  3. 关注社区生态:跟踪 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 的“暗坑”与解决方案(二)

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

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

相关文章

【C++算法】53.链表_重排链表

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 143. 重排链表 题目描述&#xff1a; 解法 模拟 找到链表的中间节点 快慢双指针 把后面的部分逆序 双指针&#xff0c;三指针&#xff0c;头插法 合并两个链表 合并两个有…

多卡分布式训练:torchrun --nproc_per_node=5

多卡分布式训练:torchrun --nproc_per_node=5 1. torchrun 实现规则 torchrun 是 PyTorch 提供的用于启动分布式训练作业的实用工具,它基于 torch.distributed 包,核心目标是简化多进程分布式训练的启动和管理。以下是其主要实现规则: 进程启动 多进程创建:torchrun 会…

Elasticsearch:加快 HNSW 图的合并速度

作者&#xff1a;来自 Elastic Thomas Veasey 及 Mayya Sharipova 过去&#xff0c;我们曾讨论过搜索多个 HNSW 图时所面临的一些挑战&#xff0c;以及我们是如何缓解这些问题的。当时&#xff0c;我们也提到了一些计划中的改进措施。本文正是这项工作的成果汇总。 你可能会问…

图片中文字无法正确显示的解决方案

图片中文字无法正确显示的解决方案 问题描述 在 Linux 系统中生成图片时&#xff0c;图片中的文字&#xff08;如中文&#xff09;未能正确显示&#xff0c;可能表现为乱码或空白。这通常是由于系统缺少对应的字体文件&#xff08;如宋体/SimSun&#xff09;&#xff0c;或者…

ISP--Demosaicking

文章目录 前言算法解释简单的线性插值代码实现 色差法和色比法基于方向加权的方法RB缺失的G通道的插值RB缺失的BR的插值G缺失的BR的插值代码实现 基于边缘检测的方法计算缺失的G计算缺失的RB值/计算缺失的G值 前言 人眼之所以有能感受到自然界的颜色&#xff0c;是因为人眼的感…

国标GB28181协议EasyCVR视频融合平台:5G时代远程监控赋能通信基站安全管理

一、背景介绍 随着移动通信行业的迅速发展&#xff0c;无人值守的通信基站建设规模不断扩大。这些基站大多建于偏远地区&#xff0c;周边人迹罕至、交通不便&#xff0c;给日常的维护带来了极大挑战。其中&#xff0c;位于空旷地带的基站设备&#xff0c;如空调、蓄电池等&…

模拟-与-现实协同训练:基于视觉机器人操控的简单方法

25年3月来自 UT Austin、Nvidia、UC Berkeley 和纽约大学的论文“Sim-and-Real Co-Training: A Simple Recipe for Vision-Based Robotic Manipulation”。 大型现实世界机器人数据集在训练通才机器人模型方面拥有巨大潜力&#xff0c;但扩展现实世界人类数据收集既耗时又耗资…

WRS-PHM电机智能安康系统:为浙江某橡胶厂构筑坚实的生产防线

以行业工况为背景 一、顾客工厂的背景 浙江某橡胶厂以电机为中心生产设备必须连续平稳运行。但由于缺乏有效的故障预警体系&#xff0c;电机故障就像潜伏着的“不定时炸弹”,不但不时地造成生产流程的中断&#xff0c;也使对生产进行管理异常艰难&#xff0c;对持续安全生产提…

将 CrewAI 与 Elasticsearch 结合使用

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何使用 CrewAI 为你的代理团队创建一个 Elasticsearch 代理&#xff0c;并执行市场调研任务。 CrewAI 是一个用于编排代理的框架&#xff0c;它通过角色扮演的方式让多个代理协同完成复杂任务。 如果你想了解更多关于代理…

Spring 的 IoC 和 DI 详解:从零开始理解与实践

Spring 的 IoC和 DI 详解&#xff1a;从零开始理解与实践 一、IoC&#xff08;控制反转&#xff09; 1、什么是 IoC&#xff1f; IoC 是一种设计思想&#xff0c;它的核心是将对象的创建和管理权从开发者手中转移到外部容器&#xff08;如 Spring 容器&#xff09;。通过这种…

ZYNQ笔记(四):AXI GPIO

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 任务&#xff1a;使用 AXI GPIO IP 核实现按键 KEY 控制 LED 亮灭&#xff08;两个都在PL端&#xff09; 一、介绍 AXI GPIO (Advanced eXtensible Interface General Purpose Input/Output) 是 Xilinx 提供的一个可…

实操(环境变量)Linux

环境变量概念 我们用语言写的文件编好后变成了程序&#xff0c;./ 运行的时候他就会变成一个进程被操作系统调度并运行&#xff0c;运行完毕进程相关资源被释放&#xff0c;因为它是一个bash的子进程&#xff0c;所以它退出之后进入僵尸状态&#xff0c;bash回收他的退出结果&…

Word / WPS 页面顶部标题 段前间距 失效 / 不起作用 / 不显示,标题紧贴页眉 问题及解决

问题描述&#xff1a; 在 Word 或者 WPS 里面&#xff0c;如果不是新的一节&#xff0c;而是位于新的一页首行时&#xff0c;不管怎么设置段前间距&#xff0c;始终是失效的&#xff0c;实际段前间距一直是零。 解决方案&#xff1a; 查询了很多方案均无法解决问题&#xff…

Linux自行实现的一个Shell(15)

文章目录 前言一、头文件和全局变量头文件全局变量 二、辅助函数获取用户名获取主机名获取当前工作目录获取最后一级目录名生成命令行提示符打印命令行提示符 三、命令处理获取用户输入解析命令行执行外部命令 四、内建命令添加环境变量检查和执行内建命令 五、初始化初始化环境…

在 Q3D 中提取汇流条电感

汇流条排简介和设计注意事项 汇流条排是用于配电的金属导体&#xff0c;在许多应用中与传统布线相比具有设计优势。在设计母线排时&#xff0c;必须考虑几个重要的因素&#xff1a; 低电感&#xff1a;高频开关内容会导致无功损耗&#xff0c;从而降低效率电容&#xff1a;管…

MySQL:事务的理解

一、CURD不加控制&#xff0c;会有什么问题 &#xff08;1&#xff09;因为&#xff0c;MySQL里面存的是数据&#xff0c;所以很有可能会被多个客户访问&#xff0c;所以mysqld可能一次会接受到多个关于CURD的请求。&#xff08;2&#xff09;且mysql内部是采用多线程来完成数…

python 基础:句子缩写

n int(input()) for _ in range(n):words input().split()result ""for word in words:result word[0].upper()print(result)知识点讲解 input()函数 用于从标准输入&#xff08;通常是键盘&#xff09;读取用户输入的内容。它返回的是字符串类型。例如在代码中…

Ruoyi-vue plus 5.2.2 flowble 结束节点异常错误

因业务要求&#xff0c; 我在结束节点的结束事件中&#xff0c;制作了一个归档的事件&#xff0c;来执行一个业务。 始终都会报错&#xff0c; 错误信息 ${archivTemplateListener} did not resolve to an implementation of interface org.flowable.engine.delegate.Execution…

Sublime Text使用教程(用Sublime Text编写C语言程序)

Sublime Text 是一款当下非常流行的文本编辑器&#xff0c;其功能强大&#xff08;提供有众多的插件&#xff09;、界面简洁、还支持跨平台使用&#xff08;包括 Mac OS X、Linux 和 Windows&#xff09;。 在程序员眼中&#xff0c;Sublime Text 不仅仅是一个文本编辑器&…

【1】k8s集群管理系列--包应用管理器之helm

一、helm概述 Helm核心是模板&#xff0c;即模板化K8s YAML文件。 通过模板实现Chart高效复用&#xff0c;当部署多个应用时&#xff0c;可以将差异化的字段进行模板化&#xff0c;在部署时使用-f或 者–set动态覆盖默认值&#xff0c;从而适配多个应用 helm工作流程&#xf…