侧边栏壁纸
博主头像
ZHD的小窝博主等级

行动起来,活在当下

  • 累计撰写 79 篇文章
  • 累计创建 53 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

JDK21的新特性

江南的风
2024-07-17 / 0 评论 / 0 点赞 / 22 阅读 / 6680 字 / 正在检测是否收录...

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();
    };
}

0

评论区