字符串模板
允许在字符串中使用占位符来动态替换变量的值。这提供了一种更简洁、更直观的方式来构建字符串,避免了传统的字符串拼接或格式化方法的复杂性。
基本使用说明:
String name = "Joan";
String info = STR."My name is \{name}";
assert info.equals("My name is Joan"); // true
同时支持多行模板和表达式
String sore = "20";
var json = STR."""
{
"user": "\{
// We only want to use the firstname
this.user.firstname()
}",
"sore : \{sore}
}
""";
Switch 增强
switch语句通过模式匹配功能得到了显著增强。以下是一个具体的示例:
Object value = "Hello";
switch (value) {
case String s -> System.out.println(s.length()); // 匹配String类型,并获取长度
case Integer i -> System.out.println(i * 2); // 匹配Integer类型,并乘以2
case null -> System.out.println("Value is null"); // 匹配null值
default -> System.out.println("Unknown type"); // 未知类型
}
这种模式匹配的方式比传统的switch语句更加灵活和强大,因为它不再局限于简单的整数或枚举类型的匹配,而是可以匹配任何类型的对象,并根据对象的类型执行相应的操作。
记录模式
记录模式是一种新的语言特性,允许我们定义简洁且不可变的数据模型。它通过自动创建构造函数、getter 和 equals/hashCode 等方法来简化数据对象的定义。
public record Person(String name, int age) {}
Person person = new Person("Alice",25);
System.out.println(person.name());
System.out.println(person.age());
虚拟线程
历史版本中,JDK 中的每个 java.lang.Thread 实例都是一个平台线程。平台线程在底层操作系统线程上运行 Java 代码,并在代码的整个生命周期内捕获操作系统线程。平台线程的数量受限于操作系统线程的数量。
在 JDK 21 中引入的虚拟线程被设计成一种轻量级的线程模型,它可以更高效地执行异步代码,避免了传统线程模型中线程的创建和销毁开销,提供更高的并发性和更低的资源消耗。
//创建一个新的并且已启动的虚拟线程
Thread thread = Thread.startVirtualThread(runnable);
//创建executor
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
//通过executor提交任务,采用虚拟线程执行
executor.submit(runnable);