JDK16的新特性

简介

在2021年3月16日,JDK的迎来了它的一个新版本JDK16,虽然JDK16不是LTS版本,但是作为下一个LTS版本JDK17的先行版本,JDK16为我们带来了17个方面的提升,包括了新的语言特性、新的工具、内存管理的提升等方面。

所以一起来看看,JDK16到底为我们提供了些什么新的特性。

JDK16的新特性

总的来说,JDK16有下面的一些新特性:

  • 一些在JDK14中引入的新特性,最终在JDK16中确定了。
  • 内存管理的提升
  • 新的打包工具
  • UNIX-Domain Socket channels
  • Value-based Classes的警告
  • Encapsulating JDK Internals by default
  • 提供了 C++ 14语言特性
  • 其他的一些预览版本的新特性

下面图是JDK从8开始到16的新特性个数:

image

可以看到JDK8和JDK9是最多的,后面基本上变动比较少。

JDK8引入了stream,lambda,泛型等一系列非常有用的特性。而JDK9则引入了新的JPMS模块化系统,所以变动比较多。

相对而言,JDK10之后变动基本上比较小,也有可能跟固定6个月发一次版本有关系。毕竟时间比较短,所以版本的变动也比较小。

注意,JDK16并不是一个LTS版本,在9月发布的JDK17才是!,大家可以关注我的后续关于JDK17新特性的文章。到现在为止,JAVA的LTS版本就有JDK8,JDK11和JDK17了。你现在用的是哪个呢?

语言方面的提升

JDK16在语言上的提升主要有两个:Pattern matching和records。这两个新特性都是在JDK14中作为预览版本引入了,最终到JDK16变成了final版本。

先来看一下Pattern matching, Pattern matching主要说的就是instanceof关键词,我们知道在JAVA中判断一个对象是不是某个类的实例,则可以使用instanceof,如果是该类的实例或者子类,则返回true,否则返回false。

但是在判断完之后,要想使用对应的对象,还需要显示的进行类型转换如下所示:

//传统写法
        if(site instanceof String){
            String stringSite = (String)site;
            System.out.println(stringSite.length());
        }

在JDK16中的Pattern matching中,可以这样写:

 //JDK16写法
        if(site instanceof String stringSite){
            System.out.println(stringSite.length());
        }

另外一个final版本的就是在JDK14和15中引入的Records,Records是一个特殊的java类,主要用来表示不可变对象的结构体。

来看一个Records的定义:

public record Address(
        String addressName,
        String city
) {
}

上面我们定义了一个Address对象,它有两个属性,分别是addressName和city,如果反编译上面代码的编译结果,可以得到:

public record Address(String addressName, String city) {
    public Address(String addressName, String city) {
        this.addressName = addressName;
        this.city = city;
    }

    public String addressName() {
        return this.addressName;
    }

    public String city() {
        return this.city;
    }
}

实际上就等于传统的:

public class AddressOld {
    
    private final String addressName;
    private final String city;

    public AddressOld(String addressName, String city) {
        this.addressName = addressName;
        this.city = city;
    }

    public String getAddressName() {
        return addressName;
    }

    public String getCity() {
        return city;
    }
}

但是在编写上要方便和简单很多。

内存管理方面的提升

在看看内存管理方面的提升,主要有两方面:Elastic Metaspace和ZGC的并发线程堆栈处理。

Metaspace 的主要功能是管理类的元数据的内存。 引入 Elastic Metaspace 是为了改进 HotSpot JVM 中元空间内存的分配和释放。 可以更快地将不需要的内存返回给操作系统,从而减少开销和内存碎片。

Elastic Metaspace使用较小的块分配内存,并通过将未使用的元空间内存返回给操作系统来提高弹性。 它可以提高性能并降低维护成本。

那么什么是ZGC的并发线程堆栈处理呢?

我们知道ZGC是HotSpot JVM中一种低延时的垃圾回收算法。但是在线程的堆栈处理过程中,总有一个制约因素就是safepoints。在safepoints这个点,java的线程是要暂停执行的,从而限制了GC的效率。

而ZGC的并发线程堆栈处理可以保证java线程可以在GC safepoints的同时可以并发执行。

Unix-Domain Socket Channel

一般来说Socket通信是基于TCP/IP的,但是熟悉unix的朋友应该知道,在unix中一切都是以文件形式存在的,即便是在内部进程的通讯也是如此。

如果是同一个host上的进程进行通讯,使用unix本身的inter-process communication (IPC)无疑是最快的方式,并且更加安全。

所以在JDK16中增加了对Unix-Domain Socket Channel的支持。

Warning For Value-based Classes

这个是什么意思呢? 我们知道java中对应的primary类型都有一个Object类型,比如int对应的是Integer。

如果是用Integer的构造函数,则我们可以这样构造:

 Integer integer= new Integer(100);

但是在JDK16中,这种构造函数已经被废弃了:

    @Deprecated(since="9", forRemoval = true)
    public Integer(int value) {
        this.value = value;
    }

我们可以直接这样写:

Integer integer2= 100;

封装内部的JDK包

一般来说,我们用的包都是JDK公开的API,但是有时候还是会用到一些JDK内部使用的类,这种类是不建议直接在外部使用的,JDK16对大部分的这种类做了封装,后面大家直接在标准JDK中查找使用即可。

C++ 14语言特性

这个是值JDK底层的C++ 源代码使用C++ 14语言特性,一般的JDK使用者是无法直接感受的。

预览语言新特性

在JDK16中还加入了几个预览的语言新特性.这里主要讲一下Vector API和Sealed Classes.

Vector API的想法是提供一种向量计算方法,最终能够比传统的标量计算方法(在支持 CPU 架构上)执行得更好。什么叫做向量计算呢?熟悉pandas的朋友可能知道,在pandas可以方便的对矩阵进行计算,如果用java实现则需要计算矩阵中的每个元素,非常麻烦,这也是python的pandas库能够流行的原因。

现在JDK16也可以做到了,我们一起来看看,先是传统写法:

//传统写法
        int[] x = {1, 2, 3, 4};
        int[] y = {4, 3, 2, 1};

        int[] c = new int[x.length];

        for (int i = 0; i < x.length; i++) {
            c[i] =x[i] * y[i];
        }

如果我们希望两个数组的数字相乘,则只能进行每个元素的遍历。现在的写法:

        var vectorA = IntVector.fromArray(IntVector.SPECIES_128, x, 0);
        var vectorB = IntVector.fromArray(IntVector.SPECIES_128, y, 0);
        var vectorC = vectorA.mul(vectorB);
        vectorC.intoArray(c, 0);

我们构建两个Vector变量,直接调用Vector类的mul方法即可。

fromArray中有三个参数,第一个是向量的长度,第二是原数组,第三个是偏移量。因为一个int有4个字节,所以这里我们使用SPECIES_128。

Sealed Classes是在JDK15中引入的概念,它表示某个类允许哪些类来继承它:

public sealed class SealExample permits Seal1, Seal2{
}

public non-sealed class Seal1 extends SealExample {
}

public final class Seal2 extends SealExample {
}

final表示Seal2不能再被继承了。non-sealed 表示可以允许任何类继承。

总结

以上就是JDK16给我们带来的新特性,总体而言是很有用的,大家觉得呢?

本文例子learn-java-base-9-to-20

本文已收录于 http://www.flydean.com/26-jdk16-new-features/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容