
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的新特性包括:

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代码来替换这些占位符,生成新的字符串。这个特性可以简化字符串拼接和处理的过程,使代码更简洁、易读。
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.]"
在上面的代码中,我们使用了文本块来将字符串分割为单词和按行分割。使用文本块可以更方便地处理文本数据,例如对文本进行分割、格式化和处理等操作。这个特性可以简化字符串处理的过程,使代码更简洁、易读。
// 使用局部变量类型推断声明变量
var name = "Alice";
var age = 30;
// 使用局部变量类型推断进行算术运算
var result = var a = 5 + 5; // a 的类型为 int
System.out.println(result); // 输出 10
在上面的代码中,我们使用了关键字"var"来声明变量,然后根据初始值来推断变量的类型。这个特性可以简化变量声明的语法,使代码更简洁。同时,我们还可以使用局部变量类型推断进行算术运算,使代码更简洁、易读。
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语句的功能,使其更灵活、易用。根据不同的条件执行不同的操作,可以使代码更清晰、易读。
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。记录类型的构造函数用于初始化这些字段,而访问器方法用于获取字段的值。使用记录类型可以更方便地创建具有固定字段的类,使代码更简洁、易读。同时,记录类型还提供了更好的封装性和安全性,可以避免直接访问类的字段。

