JDK16的新特性

迭代棱镜
• 阅读 877

简介
在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 表示可以允许任何类继承。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
JDK 16 新特性,正式发布!程序员:追不上了...
!(https://oscimg.oschina.net/oscnet/cc3506e3116b45998cb55c007a050285.jpg)地址:https://blog.csdn.net/csdnnews/article/details/110483909没错,是的,JDK16新特性,先来了你还能追
Stella981 Stella981
3年前
Centos7安装部署SonarQube7.9.1教程
0.参考文档LTS7.9.1新特性:https://www.sonarqube.org/sonarqube79lts/(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.sonarqube.org%2Fsonarqube79lts%2F)JDK
Wesley13 Wesley13
3年前
JDK15真的来了,一起来看看它的新特性
简介一年两次的JDK最新版本JDK15在2020年9月15日正式发布了,这次的JDK15给我们带了隐藏类,EdDSA,模式匹配,Records,封闭类和TextBlock等诸多新特性。一起来看看吧。JDK15的新特性JEP385DeprecateRMIActivationforRemoval
Stella981 Stella981
3年前
JupyterLab 3.0发布,原生可视化调试与中文支持
超强下一代JupyterNotebook:JupyterLab3.0已经发布了,新版本为用户带来了许多新特性,并对扩展系统进行了实质性的改进。JupyterLab是广受欢迎的JupyterNotebook「新」界面。它是一个交互式的开发环境,可用于notebook、代码或数据,因此它的扩展性非常强。用户可以使用它编写notebook、
Wesley13 Wesley13
3年前
Java 13 新特性及实战案例
近期Java界好消息频传。先是Java13发布,接着Eclipse也发布了新版本表示支持新版本的Java特性。本文介绍了Java13的新特性并展示了相关的示例。2019年9月17日,Java13正式发布。特性如下。Java13新特性此版本带来了以下几大新特性:JEP350,Dy
Wesley13 Wesley13
3年前
Java8 新特性
Java8新特性一、Java8新特性简介1\.简介Java8(又称为jdk1.8)是Java语言开发的一个主要版本。Java8是orecle公司于2014年3月发布,可以看成是自Java5以来最具革命性的版本。Java8为Java语言、编译器、类库、开发工具与
Stella981 Stella981
3年前
NetBeans 12.0 LTS发布,集成众多Oracle代码
ApacheNetBeans12.0LTS已经发布,这是一个年度主要版本,也是NetBeans从ASF毕业后的首个LTS版本,整合了11.1、11.2与11.3这些特性版本。此版本增加了对最新Java语言特性的支持,集成了来自Oracle关于JavaWeb开发的新代码,增强了ApacheMaven工具,为
Wesley13 Wesley13
3年前
JDK 15安装及新特性介绍
JDK15已经于2020年9月15日如期发布。本文介绍JDK15新特性。发布版本说明根据发布的规划,这次发布的JDK15将是一个短期的过度版,只会被Oracle支持(维护)6个月,直到明年3月的JDK16发布此版本将停止维护。而Oracle下一个长期支持版(LTS版)会在明年的9月份发布(Java1
Wesley13 Wesley13
3年前
JDK 16 即将发布,新特性速览!
你还能追上Java的更新速度吗?当开发者深陷Java8版本之际,这边下一版本Java16有了最新的消息,与Java15一样,作为短期版本,Oracle仅提供6个月的支持。根据发布计划,JDK16将在12月10日和2021年1月14进入Rampdown阶段,2021年2月4日到2
JDK8升级JDK11最全实践干货来了
1、前言截至目前(2023年),Java8发布至今已有9年,2018年9月25日,Oracle发布了Java11,这是Java8之后的首个LTS版本。那么从JDK8到JDK11,到底带来了哪些特性呢?值得我们升级吗?而且升级过程会遇到哪些问题呢?带着这些问
linbojue linbojue
2天前
Python 3.13 更新解析:这一版本你不可错过的功能与优化
python随着Python3.13的发布,开发者终于迎来了一系列备受期待的优化与新特性。作为Python3.x系列的最后一个重要版本,Python3.13不仅提升了性能,还改善了语言特性、工具支持,并且增强了兼容性。无论是企业级应用,还是个人项目,Pyt