简介
在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的新个性个数:

能够看到JDK8和JDK9是最多的,前面基本上变动比拟少。

JDK8引入了stream,lambda,泛型等一系列十分有用的个性。而JDK9则引入了新的JPMS模块化零碎,所以变动比拟多。

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

留神,JDK16并不是一个LTS版本,在9月公布的JDK17才是!,大家能够关注我的后续对于JDK17新个性的文章。到当初为止,JAVA的LTS版本就有JDK8,JDK11和JDK17了。你当初用的是哪个呢?java培训

语言方面的晋升
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);
1.
然而在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 示意能够容许任何类继承。