喜欢再看,动力无限。世界您好:)微信搜索“程序猿Alan”。本文已收录在Github.com/niumoo/JavaNotes和UnreadCodeBlog,有很多知识点和系列文章。Java14早在2019年9月就发布了,虽然不是长期支持的版本,但也带来了很多新特性。Java14官方下载:https://jdk.java.net/archive/Java14官方文档:https://openjdk.java.net/proj...Java14新特性:305:instanceof类型判断(预览)343:打包工具(孵化)345:对NUMA(非统一内存访问)的G1支持358:更有用的NullPointerExceptions359:记录(预览)361:开关表达式(标准)362:不赞成支持Solaris和SPARC端口363:删除CMS垃圾收集器364:适用于macOS的ZGC365:适用于Windows的ZGC366:弃用ParallelScavenge+SerialOldGC组合367:删除Pack200工具和API368:文本块(二次预览)370:外部内存访问API(孵化器)349:JFR事件流352:非易失性映射ByteBuffers注意:如果一个函数是预览版,编译运行时需要开启预览功能。./javac--enable-preview--release14Test.java./java--enable-previewTest本文属于Java新特性教程系列,将介绍Java各版本的新特性。您可以点击浏览。1、JEP305:instanceof类型判断(preview)Java14之前,使用instanceof进行类型判断后,使用前需要进行对象类型转换。包com.wdbyte;导入java.util.ArrayList;导入java.util.List;公共类Java14BeaforInstanceof{publicstaticvoidmain(String[]args){Objectobj=newArrayList<>();if(objinstanceofArrayList){ArrayListlist=(ArrayList)obj;list.add("www.wdbyte.com");}System.out.println(obj);}}在Java14中,判断类型转换时可以指定类型的变量名,方便使用。包com.wdbyte;导入java.util.ArrayList;公共类Java14Instanceof{publicstaticvoidmain(String[]args){Objectobj=newArrayList<>();if(objinstanceofArrayListlist){list.add("www.wdbyte.com");}System.out.println(obj);}}可以看出,使用instanceof判断类型成立后,会自动将类型转换为指定的类型。输出结果:[www.wdbyte.com]该特性在Java14中还是一个预览功能,在Java16中将正式成为常规特性。2.JEP343:PackagingTool(Incubation)在Java14中,一个打包工具介绍过,命令是jpackage,jpackage命令可以用来将JAR包打包成不同操作系统支持的软件格式。jpackage--namemyapp--inputlib--main-jarmain.jar--main-classmyapp.Main常见平台格式如下:Linux:deb和rpmmacOS:pkg和dmgWindows:msi和exe注意jpackage做不支持交叉编译,也就是说不能在windows平台上打包成macOS或者Linux系统的软件格式。3.JEP345:G1支持NUMA(非统一内存访问)G1收集器现在知道NUMA内存分配以提高G1的性能。您可以使用+XX:+UseNUMA启用此功能。延伸阅读:https://openjdk.java.net/jeps...4.JEP358:比较有用的NullPointerExceptionsNullPointerException一直是比较常见的异常,但是在Java14之前,如果一行有多个表达式,报空指针后这个时候,你可能无法仅仅从报错信息中知道哪个对象是NULL。下面是一个演示。packagecom.wdbyte;publicclassJava14NullPointerExceptions{publicstaticvoidmain(String[]args){Stringcontent1="www.wdbyte.com";字符串内容2=空;intlength=content1.length()+content2.length();System.out.println(长度);}}在Java14之前,我们只能从下面的报错中得到错误发生的行数,并不能确定contenteng1或content2是否为null。com.alibaba.security.astralnet.console.controller.ApiChartsTest.main(Java14NullPointerExceptions.java:8)线程“main”中的异常java.lang.NullPointerException但在Java14中,它会清楚地告诉您,因为“content2”为空.线程“main”中的异常java.lang.NullPointerException:无法调用“String.length()”,因为“content2”在com.wdbyte.Java14NullPointerExceptions.main(Java14NullPointerExceptions.java:8)处为空5.JEP359:记录(预览版))record是一种全新的类型。它本质上是最后一堂课。同时对所有属性进行final修改。它会自动编译publicgethashcode、equals、toString等方法,减少代码编写量。示例:编写一个Dog记录类,定义名称和年龄属性。包com.wdbyte;publicrecordDog(Stringname,Integerage){}记录的使用。packagecom.wdbyte;publicclassJava14Record{publicstaticvoidmain(String[]args){Dogdog1=newDog("ShepherdDog",1);Dogdog2=newDog("田园犬",2);Dogdog3=newDog("哈士奇",3);System.out.println(dog1);System.out.println(dog2);System.out.println(dog3);}}输出结果:Dog[name=ShepherdDog,age=1]Dog[name=PascalDog,age=2]Dog[name=Husky,age=3]该函数在Java15预览,Java16正式发布6.JEP361:Switchexpression(standard)从Java12开始对Switch表达式的改进,Java12允许switch支持L->语法。Java13引入了用于返回结果的yield关键字,但在Java12中,Java13和Java13中的函数是预览版,在Java14中,它们被正式转为普通版。//通过传入月份,输出该月份所属的季节publicstaticStringJava12(Stringmonth){returnswitch(month){case"march","april","may"->"spring";case"june","july","august"->"summer";case"september","october","november"->"autumn";case"十二月","一月","二月"->"冬天";默认->“月份错误”;};}//通过传入月份,输出该月份所属的季节publicstaticStringswitchJava13(Stringmonth){returnswitch(month){case"march","april","may":yield"spring";case"june","july","august":yield"summer";case"september","october","november":yield"autumn";case"十二月","一月","二月":yield"winter";默认值:产生“月份错误”;};}延伸阅读:Java12新特性介绍,Java13新特性介绍,JEP325:Switchexpression7.JEP368:Textblock(二(第二次预览)文本块是Java13引入的一种语法,在Java14.文本块仍然是预览功能,本次更新增加了两个转义字符。\末尾没有换行符\s表示空格示例:文本块experienceStringcontent="""{"upperSummary":null,\"sensitiveTypeList":null,"gmtModified":"2011-08-05\s10:50:09",}""";System.out.println(内容);输出结果:{"upperSummary":null,"sensitiveTypeList":null,"gmtModified":"2011-08-0510:50:09",}Java15正式发布文本块功能。其他更新JEP362:放弃对Solaris和SPARC端口的支持从Java14开始,放弃对Solaris/SPARC、Solaris/x64和Linux/SPARC端口的支持,放弃部分开发势必会加快Java整体的开发步伐。相关阅读:https://openjdk.java.net/jeps...JEP363:RemovetheCMSGarbageCollector移除对CMS(ConcurrentMarkSweep)垃圾收集器的支持,其实早在Java9就开始移除了CMS垃圾收集器不见了,但它已在Java14中正式删除。JEP364:macOS上的ZGC(实验性)Java11在Linux上引入了Z垃圾收集器(ZGC),现在已移植到macOS。JEP365:Windows上的ZGC(实验性)Java11在Linux上引入了Z垃圾收集器(ZGC),现在已移植到Windows(大于1803的版本)。JEP366:放弃ParallelScavenge+SerialOldGC的组合由于使用场景不多,维护工作量太大,放弃。相关阅读:https://openjdk.java.net/jeps...JEP367:RemovePack200ToolsandAPIReferencehttps://openjdk.java.net/proj...https://openjdk.java.net/jeps...https://openjdk.java.net/jeps...Java新特性教程<完>Helloworld:)我是Alan,一线技术工具人,认真写文章。喜欢的人都是有才华的,不仅长得帅气,说话也好听。文章持续更新中,可以关注公众号“程序猿艾伦”或访问“未读代码博客”。回复【资料】里面有我准备的各种系列的知识点和必读书籍。本文已收录于Github.com/niumoo/JavaNotes。知识点多,系列文章多。欢迎来到星空。
