版本介绍
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的新特性包括:
- 虚拟线程(Virtual Threads):这是Java 21引入的轻量级线程,可以显著减少编写、维护和观察高吞吐量并发应用程序的工作量。虚拟线程的创建和调度成本低,使得编写并发应用程序变得更简单。
- 序列集合(Sequenced Collections):这是一种新的接口族,用于表示集合的概念,这些集合的元素按照预定义的序列或顺序排列。该特性是为了解决集合框架中缺乏预定义的顺序和统一的操作集的问题。
- 分代ZGC(Generational ZGC):这是在Z垃圾回收器(ZGC)的基础上通过扩展来维护年轻对象和年老对象的独立生成,从而提高应用程序性能的特性。这将使ZGC能够更频繁地收集年轻对象,这些对象往往英年早逝。
- 记录模式(Record Patterns):这是为了增强Java编程语言而引入的特性,用于解构记录值。可以嵌套记录模式和类型模式,以实现功能强大、声明性和可组合形式的数据导航和处理。
- switch 模式匹配(Switch Pattern Matching):这是通过switch表达式和语句的模式匹配来增强Java编程语言的特性。通过将模式匹配扩展到switch,可以针对多个模式测试表达式,每个模式都有一个特定的操作,从而可以简洁、安全地表达复杂的面向数据的查询。
- 字符串模板(String Templates):这个新特性让你可以在字符串中使用占位符,然后通过Java代码来替换这些占位符,从而生成新的字符串。这个特性可以简化字符串拼接和处理的过程。
- 文本块(Text Blocks):这是Java 21中引入的一种新的字符串处理机制,可以更方便地处理文本数据。使用文本块,你可以更轻松地分割、格式化和处理文本字符串。
- 局部变量类型推断(Local Variable Type Inference):这个新特性让你可以在声明局部变量时使用关键字"var",然后根据变量的初始值来推断其类型。这个特性可以简化变量声明的语法,使代码更简洁。
- ** 改进的switch语句(Improved switch statements)**:这个新特性让你可以在switch语句中使用模式匹配,可以根据表达式的值或变量的类型来执行不同的操作。这个特性可以增强switch语句的功能,使其更灵活。
- 私有实例字段(Private Instance Fields):这个新特性让你可以创建私有实例字段,只能被其所在类的其他方法访问。这个特性可以提高代码的安全性和可维护性。
- 记录类型(Record Types):这个新特性让你可以创建自定义的记录类型,可以包含多个字段和方法。这个特性可以提高代码的可读性和可维护性。
- 扩展注解(Extended Annotations):这个新特性让你可以创建自定义的注解,可以应用于类、方法、字段等其他元素。这个特性可以增强代码的可读性和可维护性。
- 改进的并发API(Improved Concurrency API):这个新特性让你可以更方便地使用并发编程技术,例如线程池和并发集合。这个特性可以提高代码的并发性能和可维护性。
- 改进的Streams API(Improved Streams API):这个新特性让你可以更方便地处理数据流,例如对数据进行过滤、映射和收集等操作。这个特性可以提高代码的可读性和可维护性。
代码示例
- 以下是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代码来替换这些占位符,生成新的字符串。这个特性可以简化字符串拼接和处理的过程,使代码更简洁、易读。
- 以下是Java 21中引入的文本块的代码示例:
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.]"
在上面的代码中,我们使用了文本块来将字符串分割为单词和按行分割。使用文本块可以更方便地处理文本数据,例如对文本进行分割、格式化和处理等操作。这个特性可以简化字符串处理的过程,使代码更简洁、易读。
- 以下是Java 21中引入的局部变量类型推断的代码示例:
// 使用局部变量类型推断声明变量
var name = "Alice";
var age = 30;
// 使用局部变量类型推断进行算术运算
var result = var a = 5 + 5; // a 的类型为 int
System.out.println(result); // 输出 10
在上面的代码中,我们使用了关键字"var"来声明变量,然后根据初始值来推断变量的类型。这个特性可以简化变量声明的语法,使代码更简洁。同时,我们还可以使用局部变量类型推断进行算术运算,使代码更简洁、易读。
- 以下是Java 21中引入的改进的switch语句的代码示例:
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语句的功能,使其更灵活、易用。根据不同的条件执行不同的操作,可以使代码更清晰、易读。
- 以下是Java 21中引入的记录类型(Record Types)的代码示例:
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。记录类型的构造函数用于初始化这些字段,而访问器方法用于获取字段的值。使用记录类型可以更方便地创建具有固定字段的类,使代码更简洁、易读。同时,记录类型还提供了更好的封装性和安全性,可以避免直接访问类的字段。
拓展
Java9新增特性
Java10新增特性
Java11新增特性
Java12新增特性
Java13新增特性
Java14新增特性
Java15新增特性
Java16新增特性
Java17新增特性
Java18新增特性
Java19新增特性
Java20新增特性