当前位置 博文首页 > 沉默王二:Java 16 藏刀而来,Java 8 面不改色 | 它强任它强,我

    沉默王二:Java 16 藏刀而来,Java 8 面不改色 | 它强任它强,我

    作者:[db:作者] 时间:2021-06-22 18:12

    Java 16 虽然是 2021 年 3 月 16 号发布的最新正式版本,但 6 个月后也要停止更新了,虽然这个版本带来了很多漂亮的新特性,但生命周期有限,对 Java 8 的伤害性有限。

    自从 JDK 1.0 发布以来,Java 已经发布了数次重大更新。2017 年 9 月,Java 平台的主架构师 Mark Reinhold 提议,要求将 Java 的更新周期从之前的每 2 年一次调整到每 6 个月一次。于是只有 Java 8 与 Java 11 为目前提供的长期支持(LTS)版本,其余的版本,比如说 Java 9、Java 10、Java 12、Java 13、Java 14、Java 15 均已停止更新。

    他强任他强,我用 Java 8 !

    有一点我想说的是,作为一名 Java 程序员,真的非常的幸运!2008 年开始学习 Java,到 2021 年,十多年过去了,Java 仍然生机勃勃,欣欣向荣。


    推荐一份 GitHub 上标星 98.1k 的 Java 面试攻略 | 附 CSDN 资源的下载方式

    Java 的强大主要得益于开发人员的不断创新,从而强有力地保证了它对技术格局的适应性,不至于被新的竞争者挑落马下。还有 Java 的向后兼容性和安全性保证了使用者对它的信任感,如果不能保证的话,使用者可能就不得不弃坑而逃了。

    根据 IDC(一家公信力很高的从事市场研究和分析的公司)的最新报告,全球有超过 900 万名开发者在使用 Java,占全职开发者的 69%,比其他任何一门编程语言都要多。

    下一个长期支持的版本 Java 17 预计将于 2021 年 9 月实现全面可用性,它当中蕴藏的新特性肯定会在 Java 16 中有所体现,所以我们还是有必要来提前感受下新版本的魅力——虽然 Java 8 的新特性都还没摸透, 嘿嘿。

    在 Java 16 中,标记已解决的问题有 1897 个,大头由 Oracle 解决,剩余的 500 个由个人开发者和其他组织的开发者解决,其中榜上有名的国内组织有 Tencent 和 Alibaba 两家巨头。

    Java 16 的增强建议有 17 条,可以在 OpenJDK 的官网上看得到。

    其中有一些离我们开发者比较远,我就一笔带过;有一些我认为比较重要,就重点说明。来,开搞!

    ----新特性----

    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) { }
    

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

    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 的时候,差点憋死,很多特性到最后都不了了之了。

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

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

    推荐阅读:

    计算机教育中缺失的一课

    奉劝那些想把编程学好的学弟学妹们