当前位置: 首页 > 后端技术 > Java

JDK16的新特性

时间:2023-04-01 15:31:25 Java

介绍2021年3月16日,JDK迎来了新版本的JDK16,虽然JDK16不是LTS版本,但是作为下一个LTS版本JDK17的第一个版本,JDK16给我们带来了17个方面改进,包括新的语言特性、新工具和改进的内存管理。那么我们就来看看JDK16为我们提供了哪些新特性。JDK16的新特性总的来说,JDK16有以下新特性:JDK14中引入的一些新特性最终在JDK16中得到确认。内存管理的改进新的打包工具UNIX-DomainSocketchannelsValue-basedClassesWarning默认封装JDKInternals提供C++14语言特性其他预览版本的其他新特性下图显示了JDK从8到16的新特性编号:它可以看到JDK8和JDK9是最多的,后面的变化基本上就少了。JDK8引入了流、lambda、泛型等一系列非常有用的特性。JDK9引入了新的JPMS模块化系统,所以有很多变化。相对来说,JDK10之后的变化基本上比较小,也可能和每6个月发布一次固定版本有关。毕竟时间比较短,所以版本变化也比较小。请注意,JDK16不是LTS版本,9月发布的JDK17是!,大家可以关注我后续关于JDK17新特性的文章。到目前为止,JAVA的LTS版本有JDK8、JDK11和JDK17。你现在用的是哪一款?语言改进JDK16有两个主要的语言改进:模式匹配和记录。这两个新特性在JDK14中作为预览版引入,最终在JDK16中成为最终版本。我们先来看看模式匹配。模式匹配主要是指instanceof关键字。我们知道,在JAVA中,判断一个对象是否是某个类的实例,可以使用instanceof。如果是类的实例或子类,则返回true,否则返回false。但是判断之后,如果要使用对应的对象,需要进行类型转换,如下://传统写法if(siteinstanceofString){StringstringSite=(String)site;System.out.println(stringSite.length());在JDK16中的Patternmatching中,可以这样写://JDK16writingif(siteinstanceofStringstringSite){System.out.println(stringSite.length());}另一个最终版本是JDK14、15引入的Records。Records是一个特殊的java类,主要用来表示不可变对象的结构。我们看一个Records的定义:publicrecordAddress(StringaddressName,Stringcity){}上面我们定义了一个Address对象,它有两个属性,分别是addressName和city。如果反编译上述代码的编译结果,可以得到:这个。城市=城市;}publicStringaddressName(){returnthis.addressName;}publicStringcity(){returnthis.city;}}实际上等同于传统的:publicclassAddressOld{privatefinalStringaddressName;私人最终字符串城市;publicAddressOld(StringaddressName,Stringcity){this.addressName=addressName;这个。城市=城市;}publicStringgetAddressName(){返回地址名;}publicStringgetCity(){返回城市;}}但是写起来方便简单多了。内存管理方面的改进从内存管理方面的改进来看,主要有两个方面:ElasticMetaspace和ZGC的并发线程栈处理。Metaspace的主要功能是为类元数据管理内存。弹性元空间的引入是为了改进HotSpotJVM中元空间内存的分配和释放。不需要的内存可以更快地返回给操作系统,减少开销和内存碎片。弹性元空间使用较小的块分配内存,并通过将未使用的元空间内存返回给操作系统来提高弹性。它提高了性能并降低了维护成本。那么ZGC的并发线程栈处理是怎样的呢?我们知道ZGC是HotSpotJVM中的一种低延迟垃圾回收算法。但是在线程栈处理的过程中,总是有一个限制因素,那就是safepoints。在safepoints点,java线程必须挂起,限制了GC的效率。而ZGC的并发线程栈处理可以保证java线程在GC安全点的同时并发执行。Unix-DomainSocketChannel一般来说,Socket通信是基于TCP/IP的,但是熟悉Unix的朋友应该知道,在Unix中一切都是以文件的形式存在的,即使是内部进程中的通信也是如此。如果同一台主机上的进程进行通信,使用unix自带的进程间通信(IPC)无疑是最快和安全的方式。所以在JDK16中加入了对Unix-DomainSocketChannel的支持。基于值的类的警告是什么意思?我们知道java中对应的初级类型有一个Object类型,比如int对应Integer。如果使用Integer构造函数,我们可以这样构造:Integerinteger=newInteger(100);但是在JDK16中,这个构造函数已经被废弃了:@Deprecated(since="9",forRemoval=true)publicInteger(intvalue){this.value=value;}我们可以直接这样写:Integerinteger2=100;封装JDK内部的包一般来说,我们使用的包都是JDK的公共API,但有时也会用到JDK内部使用的一些类。这个类不建议直接在外面使用。JDK16封装了大部分这些类,以后可以在标准的JDK中直接搜索使用。C++14语言特性这是因为JDK底层C++源码使用了C++14语言特性,普通JDK用户无法直接感受。预览新语言特性在JDK16中,还添加了几个预览新语言特性。这里主要讲VectorAPI和SealedClasses。VectorAPI的思想是提供一种向量计算方法,最终可以比传统的标量计算方法(在支持的CPU架构中)表现得更好。什么是矢量计算?熟悉pandas的朋友可能知道在pandas中计算矩阵很方便。如果用java实现,需要计算矩阵中的每一个元素,非常麻烦。这就是为什么python的pandas库如此受欢迎的原因。现在JDK16也可以了,我们来看看,首先是传统的写法://传统的写法int[]x={1,2,3,4};int[]y={4,3,2,1};int[]c=newint[x.length];for(inti=0;i