告别旧版:立即下载并升级到 Java 21
Java 世界一直在不断发展,每一次的长期支持(LTS)版本的发布,都标志着一个重要的里程碑。现在,Java 21 已经正式发布,它不仅带来了性能上的显著提升,还引入了一系列强大的新功能,旨在简化开发、提高生产力。无论您是企业开发者还是个人爱好者,现在都是告别旧版本、拥抱 Java 21 的最佳时机。
为什么选择 Java 21?
作为最新的 LTS 版本,Java 21 意味着您将获得 Oracle 提供的数年稳定支持和安全更新,这对于任何生产环境中的应用程序都至关重要。但更令人兴奋的是它带来的变革性新特性:
- 虚拟线程(Virtual Threads):彻底改变并发编程的游戏规则。
- 序列化集合(Sequenced Collections):提供统一、便捷的集合操作接口。
- 更智能的语言特性:如字符串模板和未命名模式,让代码更简洁、更安全。
- 性能巅峰:通过分代 ZGC 等改进,进一步降低延迟,提升应用吞吐量。
是时候深入了解这些激动人心的变化了。
Java 21 核心亮点解析
1. 虚拟线程(Project Loom)
这是 Java 21 中最引人注目的特性。在过去,我们依赖操作系统线程来处理并发任务,但这些线程是宝贵且昂贵的资源。虚拟线程则是一种由 JVM 管理的、极其轻量级的线程。
它解决了什么问题?
在传统的“一个请求一个线程”模型中,当应用需要处理成千上万的并发连接时(例如微服务或 Web 应用),系统会因创建大量平台线程而迅速耗尽资源。
虚拟线程如何工作?
您可以轻松创建数百万个虚拟线程,而不会对系统造成巨大负担。当虚拟线程遇到阻塞操作(如 I/O 等待)时,它不会占用操作系统线程,而是“让出”它,让底层平台线程可以去执行其他任务。这使得开发者可以用简单、易读的同步代码,编写出具备极高吞吐量的异步应用。
java
// 使用虚拟线程执行任务,代码简洁明了
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 10_000).forEach(i -> {
executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
return i;
});
});
} // executor.close() 会等待所有任务完成
2. 序列化集合 (Sequenced Collections)
在 Java 21 之前,要获取 List 的第一个元素很简单 (list.get(0)), 但获取 LinkedHashSet 的第一个元素就很麻烦。序列化集合为此引入了统一的接口。
任何拥有确定出现顺序的集合(List, LinkedHashSet, SortedSet 等)现在都实现了 SequencedCollection 接口,它提供了简单、统一的方法:
getFirst(): 获取第一个元素。getLast(): 获取最后一个元素。reversed(): 返回一个反序的集合视图。
“`java
List
System.out.println(list.getFirst()); // 输出 “A”
System.out.println(list.getLast()); // 输出 “C”
// 反向遍历
for (String s : list.reversed()) {
System.out.print(s); // 输出 “CBA”
}
“`
3. 字符串模板 (预览功能)
字符串拼接一直是 Java 代码中的常见痛点。简单的 + 拼接可读性差,String.format 或 MessageFormat 又有些繁琐。Java 21 引入了更安全、更直观的字符串模板。
它允许您将变量和表达式直接嵌入到字符串中,代码清晰且类型安全。
“`java
String name = “Joan”;
// 使用 STR 模板处理器
String info = STR.”My name is {name}.”;
// info 的值为 “My name is Joan.”
// 还可以嵌入复杂的表达式
String json = STR.”””
{
“name”: “{name}”,
“birthDate”: “{LocalDate.now()}”
}
“””;
“`
4. 未命名模式和变量 (预览功能)
有时,您必须声明一个变量,但又从不使用它。例如,在 try-with-resources 语句或 switch 表达式中。Java 21 允许使用下划线 _ 作为占位符,以表明该变量是“未命名”或“无用”的。
这不仅能减少代码杂音,还能让编译器和静态分析工具更好地理解您的意图。
“`java
// 在 switch 中,我们只关心是否为 Point,不关心其内部 x, y 的值
switch (obj) {
case Point(, ): // 匹配 Point 类型,但不使用其字段
System.out.println(“It’s a point.”);
break;
// …
}
// 在循环中,我们只关心执行次数,不关心具体的值
for (int i = 0; i < 10; i++) {
// some repeated action…
}
// 可以写成:
for (var _ : aList) {
// aList 有多少个元素,就执行多少次
}
“`
如何下载和升级?
升级到 Java 21 非常简单。
-
下载 JDK:
- 访问 Oracle 官方 Java 21 下载页面。
- 或者选择其他流行的 OpenJDK 发行版,如 Adoptium Temurin。
- 根据您的操作系统(Windows, macOS, Linux)下载对应的安装包。
-
安装并配置环境变量:
- 运行安装程序。
- 更新系统的
JAVA_HOME环境变量,使其指向 Java 21 的安装目录。 - Windows: 在“系统属性” -> “高级” -> “环境变量”中修改
JAVA_HOME和Path。 - macOS/Linux: 在
.zshrc,.bash_profile或类似的文件中更新JAVA_HOME并将其bin目录添加到PATH。
bash
export JAVA_HOME=/path/to/your/jdk-21
export PATH=$JAVA_HOME/bin:$PATH
-
验证安装:
打开一个新的终端或命令提示符,运行以下命令:
bash
java -version
如果您看到类似openjdk version "21..."的输出,那么恭喜您,安装成功! -
更新您的项目配置:
- Maven: 在
pom.xml中,将java.version属性更新为21。
xml
<properties>
<java.version>21</java.version>
</properties> - Gradle: 在
build.gradle(或build.gradle.kts) 中,更新sourceCompatibility和targetCompatibility。
groovy
// build.gradle
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
- Maven: 在
结论
Java 21 不仅仅是一次常规更新,它是一次飞跃。凭借虚拟线程带来的并发革命、序列化集合的便捷性以及众多语法上的改进,它为开发者提供了构建下一代高性能、高可维护性应用的强大工具。
长期支持(LTS)的保障让您可以放心大胆地在生产环境中使用它。不要再犹豫了,立即下载并升级到 Java 21,亲自体验 Java 的未来!