Java 21 新特性
1. 字符串模板 (预览版本)
参考链接:https://openjdk.org/jeps/430
String Templates 引入了一种更为简洁直观的字符串动态构建方式。它允许我们直接通过占位符${}
将变量值嵌入字符串中,省去了繁琐的手动拼接。Java 编译器在运行时会自动将这些占位符替换为相应的变量值。这些表达式功能强大,不仅支持局部变量、静态或非静态字段,还能包含方法调用及计算结果等。
这种创新的字符串处理机制被称为Template Expressions(模版表达式),是Java中的一种新表达式类型。它不仅能够实现字符串插值,还具备编程能力,使开发人员能更加安全、高效地构建字符串。更重要的是,模版表达式的应用不仅限于字符串组合,还能根据特定规则将结构化文本转化为多种类型的对象。
在此之前:
//concatenation
message = "Greetings " + name + "!";
//String.format()
message = String.format("Greetings %s!", name); //concatenation
//MessageFormat
message = new MessageFormat("Greetings {0}!").format(name);
//StringBuilder
message = new StringBuilder().append("Greetings ").append(name).append("!").toString();
在此之后:
String title = "My Online Guitar Store";
String text = "Buy your next Les Paul here!";
String html = STR."""
<html>
<head>
<title>\{title}</title>
</head>
<body>
<p>\{text}</p>
</body>
</html>
""";
int x = 1,y =2;
String str = STR."\{x} + \{y} = \{x + y}";
Java 目前支持三种模板处理器:
STR:自动执行字符串插值,即将模板中的每个嵌入式表达式替换为其值(转换为字符串)。
FMT:和 STR 类似,但是它还可以接受格式说明符,这些格式说明符出现在嵌入式表达式的左边,用来控制输出的样式
RAW:不会像 STR 和 FMT 模板处理器那样自动处理字符串模板,而是返回一个 StringTemplate 对象,这个对象包含了模板中的文本和表达式的信息
2. 有序集合
参考链接:https://openjdk.org/jeps/431
JDK 21新增了一种名为序列化集合(也称作有序集合)的集合类型,它确保元素有固定的出现顺序,即无论遍历多少次,元素的顺序都保持一致。这种集合简化了对首个元素、末尾元素的操作,并提供了反向遍历集合的功能。
SequencedCollection:
interface SequencedCollection<E> extends Collection<E> {
// New Method
SequencedCollection<E> reversed();
// Promoted methods from Deque<E>
void addFirst(E);
void addLast(E);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
}
SequencedSet:
interface SequencedSet<E> extends SequencedCollection<E>, Set<E> {
SequencedSet<E> reversed();
}
SequencedMap:
interface SequencedMap<K,V> extends Map<K,V> {
// New Methods
SequencedMap<K,V> reversed();
SequencedSet<K> sequencedKeySet();
SequencedCollection<V> sequencedValues();
SequencedSet<Entry<K,V>> sequencedEntrySet();
V putFirst(K, V);
V putLast(K, V);
// Promoted Methods from NavigableMap<K, V>
Entry<K, V> firstEntry();
Entry<K, V> lastEntry();
Entry<K, V> pollFirstEntry();
Entry<K, V> pollLastEntry();
}
3. 分代 ZGC
参考链接:https://openjdk.org/jeps/439
JDK21 中对 ZGC 进行了功能扩展,增加了分代 GC 功能。分代 ZGC 可以显著减少垃圾回收过程中的停顿时间,并提高应用程序的响应性能。这对于大型 Java 应用程序和高并发场景下的性能优化非常有价值。不过,默认是关闭的,需要通过配置打开:
// 启用分代ZGC
java -XX:+UseZGC -XX:+ZGenerational
4. Record 模式
参考链接:https://openjdk.org/jeps/440
使用记录模式增强Java编程语言,以解构记录值。记录模式和类型模式可以嵌套,以实现强大、声明性和可组合的数据导航和处理形式。记录模式不能单独使用,而是要与 instanceof 或 switch 模式匹配一同使用。
例如:
record Shape(String type, long unit){}
// 没有记录模式之前
Shape circle = new Shape("Circle", 10);
if (circle instanceof Shape shape) {
System.out.println("Area of " + shape.type() + " is : " + Math.PI * Math.pow(shape.unit(), 2));
}
// 有记录模式之后
Shape circle = new Shape("Circle", 10);
if (circle instanceof Shape(String type, long unit)) {
System.out.println("Area of " + type + " is : " + Math.PI * Math.pow(unit, 2));
}
5. switch 模式匹配
参考链接:https://openjdk.org/jeps/433
正如 instanceof
一样, switch
也紧跟着增加了类型匹配自动转换功能。
例如:
// instanceof
if (o instanceof String) { // Old code
String s = (String)o;
...
}
if (o instanceof String s) { // New code
...
}
// switch
static String formatter(Object o) { // Old code
if (o instanceof Integer i) {
formatted = String.format("int %d", i);
}
...
}
static String formatterPatternSwitch(Object o) { // New code
return switch (o) {
case Integer i -> String.format("int %d", i);
...
default -> o.toString();
};
}
评论区