Java 14和15 新特性
Java14
空指针异常精准提示
通过 JVM 参数中添加-XX:+ShowCodeDetailsInExceptionMessages
,可以在空指针异常中获取更为详细的调用信息,更快的定位和解决问题。
1 | a.b.c.i = 99; // 假设这段代码会发生空指针 |
Java 14 之前:
1 | Exception in thread "main" java.lang.NullPointerException |
Java 14 之后:
1 | // 增加参数后提示的异常中很明确的告知了哪里为空导致 |
switch 的增强(转正)
Java12 引入的 switch(预览特性)在 Java14 变为正式版本,不需要增加参数来启用,直接在 JDK14 中就能使用。
Java12 为 switch 表达式引入了类似 lambda 语法条件匹配成功后的执行块,不需要多写 break ,Java13 提供了 yield
来在 block 中返回值。
1 | String result = switch (day) { |
预览新特性
record 关键字
record
关键字可以简化 数据类(一个 Java 类一旦实例化就不能再修改)的定义方式,使用 record
代替 class
定义的类,只需要声明属性,就可以在获得属性的访问方法,以及 toString()
,hashCode()
, equals()
方法。
类似于使用 class
定义类,同时使用了 lombok 插件,并打上了@Getter,@ToString,@EqualsAndHashCode
注解。
1 | /** |
文本块
Java14 中,文本块依然是预览特性,不过,其引入了两个新的转义字符:
\
: 表示行尾,不引入换行符\s
:表示单个空格
1 | String str = "凡心所向,素履所往,生如逆旅,一苇以航。"; |
instanceof 增强
依然是预览特性 ,Java 12 新特性中介绍过。
其他
- 从 Java11 引入的 ZGC 作为继 G1 过后的下一代 GC 算法,从支持 Linux 平台到 Java14 开始支持 MacOS 和 Windows(个人感觉是终于可以在日常开发工具中先体验下 ZGC 的效果了,虽然其实 G1 也够用)
- 移除了 CMS(Concurrent Mark Sweep) 垃圾收集器(功成而退)
- 新增了 jpackage 工具,标配将应用打成 jar 包外,还支持不同平台的特性包,比如 linux 下的
deb
和rpm
,window 平台下的msi
和exe
Java15
CharSequence
CharSequence
接口添加了一个默认方法 isEmpty()
来判断字符序列为空,如果是则返回 true。
1 | public interface CharSequence { |
TreeMap
TreeMap
新引入了下面这些方法:
putIfAbsent()
computeIfAbsent()
computeIfPresent()
compute()
merge()
ZGC(转正)
Java11 的时候 ,ZGC 还在试验阶段。
当时,ZGC 的出现让众多 Java 开发者看到了垃圾回收器的另外一种可能,因此备受关注。
经过多个版本的迭代,不断的完善和修复问题,ZGC 在 Java 15 已经可以正式使用了!
不过,默认的垃圾回收器依然是 G1。你可以通过下面的参数启动 ZGC:
1 | java -XX:+UseZGC className |
EdDSA(数字签名算法)
新加入了一个安全性和性能都更强的基于 Edwards-Curve Digital Signature Algorithm (EdDSA)实现的数字签名算法。
虽然其性能优于现有的 ECDSA 实现,不过,它并不会完全取代 JDK 中现有的椭圆曲线数字签名算法( ECDSA)。
1 | KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519"); |
输出:
1 | 0Hc0lxxASZNvS52WsvnncJOH/mlFhnA8Tc6D/k5DtAX5BSsNVjtPF4R4+yMWXVjrvB2mxVXmChIbki6goFBgAg== |
文本块(转正)
在 Java 15 ,文本块是正式的功能特性了。
隐藏类(Hidden Classes)
隐藏类是为框架(frameworks)所设计的,隐藏类不能直接被其他类的字节码使用,只能在运行时生成类并通过反射间接使用它们。
预览新特性
密封类
密封类(Sealed Classes) 是 Java 15 中的一个预览新特性。
没有密封类之前,在 Java 中如果想让一个类不能被继承和修改,我们可以使用final
关键字对类进行修饰。不过,这种方式不太灵活,直接把一个类的继承和修改渠道给堵死了。
密封类可以对继承或者实现它们的类进行限制,这样这个类就只能被指定的类继承。
1 | // 抽象类 Person 只允许 Employee 和 Manager 继承。 |
另外,任何扩展密封类的类本身都必须声明为 sealed
、non-sealed
或 final
。
1 | public final class Employee extends Person { |
如果允许扩展的子类和封闭类在同一个源代码文件里,封闭类可以不使用 permits 语句,Java 编译器将检索源文件,在编译期为封闭类添加上许可的子类。
instanceof 模式匹配
Java 15 并没有对此特性进行调整,继续预览特性,主要用于接受更多的使用反馈。
在未来的 Java 版本中,Java 的目标是继续完善 instanceof
模式匹配新特性。
其他
- Nashorn JavaScript 引擎彻底移除:Nashorn 从 Java8 开始引入的 JavaScript 引擎,Java9 对 Nashorn 做了些增强,实现了一些 ES6 的新特性。在 Java 11 中就已经被弃用,到了 Java 15 就彻底被删除了。
- DatagramSocket API 重构
- 禁用和废弃偏向锁(Biased Locking):偏向锁的引入增加了 JVM 的复杂性大于其带来的性能提升。不过,你仍然可以使用
-XX:+UseBiasedLocking
启用偏向锁定,但它会提示这是一个已弃用的 API。