--- title: Java 15 新特性概览 category: Java tag: - Java新特性 --- ## CharSequence `CharSequence` 接口添加了一个默认方法 `isEmpty()` 来判断字符序列为空,如果是则返回 true。 ```java public interface CharSequence { default boolean isEmpty() { return this.length() == 0; } } ``` ## TreeMap `TreeMap` 新引入了下面这些方法: - `putIfAbsent()` - `computeIfAbsent()` - `computeIfPresent()` - `compute()` - `merge()` ## ZGC(转正) Java11 的时候 ,ZGC 还在试验阶段。 当时,ZGC 的出现让众多 Java 开发者看到了垃圾回收器的另外一种可能,因此备受关注。 经过多个版本的迭代,不断的完善和修复问题,ZGC 在 Java 15 已经可以正式使用了! 不过,默认的垃圾回收器依然是 G1。你可以通过下面的参数启动 ZGC: ```bash $ java -XX:+UseZGC className ``` ## EdDSA(数字签名算法) 新加入了一个安全性和性能都更强的基于 Edwards-Curve Digital Signature Algorithm (EdDSA)实现的数字签名算法。 虽然其性能优于现有的 ECDSA 实现,不过,它并不会完全取代 JDK 中现有的椭圆曲线数字签名算法( ECDSA)。 ```java KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519"); KeyPair kp = kpg.generateKeyPair(); byte[] msg = "test_string".getBytes(StandardCharsets.UTF_8); Signature sig = Signature.getInstance("Ed25519"); sig.initSign(kp.getPrivate()); sig.update(msg); byte[] s = sig.sign(); String encodedString = Base64.getEncoder().encodeToString(s); System.out.println(encodedString); ``` 输出: ``` 0Hc0lxxASZNvS52WsvnncJOH/mlFhnA8Tc6D/k5DtAX5BSsNVjtPF4R4+yMWXVjrvB2mxVXmChIbki6goFBgAg== ``` ## 文本块(转正) 在 Java 15 ,文本块是正式的功能特性了。 ## 隐藏类(Hidden Classes) 隐藏类是为框架(frameworks)所设计的,隐藏类不能直接被其他类的字节码使用,只能在运行时生成类并通过反射间接使用它们。 ## 预览新特性 ### 密封类 **密封类(Sealed Classes)** 是 Java 15 中的一个预览新特性。 没有密封类之前,在 Java 中如果想让一个类不能被继承和修改,我们可以使用`final` 关键字对类进行修饰。不过,这种方式不太灵活,直接把一个类的继承和修改渠道给堵死了。 密封类可以对继承或者实现它们的类进行限制,这样这个类就只能被指定的类继承。 ```java // 抽象类 Person 只允许 Employee 和 Manager 继承。 public abstract sealed class Person permits Employee, Manager { //... } ``` 另外,任何扩展密封类的类本身都必须声明为 `sealed`、`non-sealed` 或 `final`。 ```java public final class Employee extends Person { } public non-sealed class Manager extends Person { } ``` ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/image-20210820153955587.png) 如果允许扩展的子类和封闭类在同一个源代码文件里,封闭类可以不使用 permits 语句,Java 编译器将检索源文件,在编译期为封闭类添加上许可的子类。 ### instanceof 模式匹配 Java 15 并没有对此特性进行调整,继续预览特性