天天看点

Java 16 藏刀而来,Java 8 面不改色 | 它强任它强,我用 Java 8,嘿嘿(2)

----新特性----

1)394:instanceof 模式匹配

instanceof 模式匹配,Java 14 和 Java 15 都作为预览功能引入了,这个新的特性现在转正了,Java 17 后就可以放心大胆地使用了。

以前这样用:

// 先判断类型

if (obj instanceof String) {

   // 然后转换

   String s = (String) obj;

   // 然后才能使用

}

现在可以这样用:

if (obj instanceof String s) {

   // 如果类型匹配 直接使用

可以直接在 if 条件判断类型的时候添加一个变量,就不需要再强转和声明新的变量了。是不是特别简洁?

2)395 Record 记录类

Record 记录类也是 Java 14 和 Java 15 作为预览功能引入的,提供了一种更紧凑的语法来声明类,作为不可变数据的透明载体,可以大大减少类中的一些模板代码。我在介绍 Java 14 的时候就希望这个特性能转正,结果 15 的时候没有转,直到 Java 16,终于转了。

以前这样写:

public final class Writer {
    private final String name;
    private final int age;
    public Writer(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
}      

现在可以这样写:

public record Writer(String name, int age) { }

1

一行代码就搞定,可以来看一下反编译后的字节码:

public final class Writer extends java.lang.Record {
    private final java.lang.String name;
    private final int age;
    public Writer(java.lang.String name, int age) { /* compiled code */ }
    public java.lang.String toString() { /* compiled code */ }
    public final int hashCode() { /* compiled code */ }
    public final boolean equals(java.lang.Object o) { /* compiled code */ }
    public java.lang.String name() { /* compiled code */ }
    public int age() { /* compiled code */ }
}      

也就是说,Java 帮我们自动继承了 Record 类,并提高了一些模板代码,比如说构造方法、toString()、hashCode() 等等。

----JVM 改进----

3)376 ZGC

ZGC(Z Carbage Collectior)是 Java 中最新的一种垃圾收集器,随后我打算专门分享一篇文章来介绍它,比较陌生的小伙伴可以不用管。ZGC 的目标就是低延迟,保证最大停顿时间在几毫秒之间,不管堆有多大或者存活的对象有多少。

即使是在大型堆上,也可以在 GC 安全点内实现亚毫秒级的暂停,从而提高应用程序的效率和性能。

4)387 弹性元数据

新方案以较小的块来分配元空间内存,从而减少类加载器的开销和碎片。通过将未使用的元数据内存以更快的速度返回给操作系统来提高弹性,从而进一步提高应用程序的性能并降低内存的利用率。

----新工具和类----

5)380 Unix-Domain 套接字通道

Unix-Domain 套接字通道一直是大多数 Unix 平台的功能,这个版本就可以在 Windows 10 和 Windows Server 2019 中实现这个功能了。

6)392 打包工具

此版本为了给用户提供更自然的安装体验,可以将 Java 应用程序打包成不同的本地格式,比如说可以在 Windows 上安装的 msi 和 exe,macOS 上安装的 pkg 和 dmg,以及 Linux 上的 deb 和 rpm。

----安全性----

7)390 基于值的类提议

此提议会将包装器类(比如 java.lang.Integer)修改为基于值的(类似于 java.util.Optional)类。

8)396 默认情况下,对 JDK 内部进行强封装

此提议的目的是为了提高 JDK 的安全性和可维护性,鼓励开发人员从使用内部 API 迁移到使用标准的外部 API,以便开发人员和用户都可以更轻松地升级。

----孵化器和预览功能----

9)338 矢量 API

JDK 中增加了一个新的模块 vector,该 API 将使开发者可以轻松地用 Java 编写可移植的高性能矢量算法。

10)389 外部链接 API

该 API 提供了纯静态类型的、纯 Java 代码的形式对本地代码进行访问。

11)393 外部的内存访问 API

此 API 使 Java 程序可以安全有效地对各种外部存储器(例如本机存储器、PMEP、托管堆存储器等)进行操作。

12)397 密封类

该类可以限制指定的类或接口来继承或实现它。

----提高 OpenJDK 开发者的生产效率----

剩下这些提议对 Java 用户(使用 Java 编写代码或者应用程序的人员)不直接可见,只对 Java 开发者(进行 OpenJDK 开发的人员)可见。因此,对于作为普通用户的我们来说,简单了解下就行了。

13)347 启用 C++ 14 的语言特性

看过 OpenJDK 的小伙伴应该知道,Java 的虚拟机和编译器是用 C 和 C++ 两种语言实现的。所以启用 C++ 14 的语言特性应该会提高开发者的生产效率,之前用的 C++ 98/03语言标准。

14)357 OpenJDK 的源码仓库从 Mercurial 迁移至 Git

Git 目前已经成为代码版本管理领域的绝对统治者,Java 也是顺应潮流。

15)369 OpenJDK 的源码仓库托管到了 GitHub 上

OpenJDK 的 GitHub 地址:

https://github.com/openjdk

16)386 将 JDK 移植到 AIpine Linux

17)388 将 JDK 移植到 Windows/AArch64

386 和 388 这俩没什么好说的,pass。

总结一波,Java 16 藏的刀的确没啥杀伤力,唯一两个对我们开发者有用的提议,394 和 395,Java 14 已经提出了,到了 Java 16,不过不是转正而已,对 Java 8 的王者地位几乎没有什么影响。

但我想表达是,正式 Java 的这种快速迭代的尿性,反而使它更灵活一点。不像早年间从 Java 6 到 Java 7 的时候,差点憋死,很多特性到最后都不了了之了。

软件的快速迭代已经成为主流模式,是骡子是马拉出来遛遛,不行就砍,行了就转正,哈哈~

听说一键三连的小伙伴运气都不会差,不管大厂还是小厂还是外企,统统成功上岸。