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

Java17即将发布,补上Java13的新特性

时间:2023-04-01 17:11:42 Java

喜欢再看,动力无限。世界您好:)微信搜索“程序猿Alan”。本文已收录在Github.com/niumoo/JavaNotes和UnreadCodeBlog,有很多知识点和系列文章。本文属于Java新特性教程系列,已收录于Github.com/niumoo/JavaNotes,点个赞,不要迷路。由于Oracle调整了Java版本的发布节奏,Java版本的发布速度越来越快。虽然说Java版本是别人发布的,我用的是Java8,但是新版本的Java还是要学习的。Java13早在2019年9月就发布了,虽然不是长期支持版本,但也带来了很多新特性。Java13官方下载:https://jdk.java.net/archive/Java13官方文档:http://openjdk.java.net/projects/jdk/13/Java13新特性:JEP350:DynamicCDSArchiveJEP351:ZGC,returnunusedmemory(experimental)JEP353:ReimplementSocketAPIJEP354:Switchexpression(secondarypreview)JEP355:Textblock(preview)扩展名:本文属于Java新特性教程系列,会介绍Java各个版本的新特性,可以点击浏览。1.JEP350DynamicCDSArchivingJVM开始在内存中加载类有一个步骤,如果有多个jar,加载第一个jar的速度最慢。这会延长程序的启动时间。为了减少这个时间,Java10引入了应用类数据共享(CDS)机制,可以在程序之间共享你想要共享的类,让不同的Java进程可以共享这个类来减少这个占用的空间类和加载速度。不过在Java10中使用这个特性的步骤比较繁琐。延伸阅读:Java10新特性介绍和Java13中AppCDS允许Java应用在程序执行结束时动态归档(前提是JVM不崩溃);存储的内容包括所有加载的应用程序类型类和使用的类库,这些存储的类库在默认的CDS存档中不存在。使用该功能非常简单,只需要在程序启动时增加启动参数即可。#ArchiveClassesAtExit,在程序结束时动态归档bin/java-XX:ArchiveClassesAtExit=hello.jsa-cphello.jarHello#SharedArchiveFile,使用指定归档启动bin/java-XX:SharedArchiveFile=hello.jsa-cp你好.jar你好2。JEP351:ZGC,returnunusedmemory(experimental)在Java13之前,虽然ZGC在清理内存时造成的暂停时间非常少,但是即使系统长时间未使用内存,ZGC也不会将内存归还给操作,非常对非常关心内存使用的应用程序不友好。例如:云上的容器环境,资源按使用量付费。应用程序虽然长时间处于空闲状态,但占用内存,导致其他正在运行的程序内存不足。新增的功能可以让ZGC将长时间不用的内存归还给操作系统,这对一些用户来说是非常友好的。3、JEP353:重新实现SocketAPIjava.net.Socket和java.net.ServerSocket类早在Java1.0就引入了,其实现的Java代码和C语言代码混杂,维护难度很大并调试;而且这种实现方式还存在并发问题,有时很难排查。因此,Java13中引入了新的实现,使用新的实现NioSocketImpl来替代旧的PlainSocketImpl实现。虽然功能相同,但在当前和以后的版本中都不会删除旧方法。用户可以随时通过-Djdk.net.usePlainSocketImpl参数切换回旧的实现方式,以兼容突发情况。编写一个测试类来检测这种变化。importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;publicclassTest{publicstaticvoidmain(String[]args){try(ServerSocketserverSocket=newServerSocket(8000)){布尔值运行=真;while(running){套接字clientSocket=serverSocket.accept();//用clientSocket做点什么}}catch(IOExceptione){e.printStackTrace();}}}使用Java13运行,传递参数-XX:+TraceClassLoading跟踪加载的类,可以在日志中看到NioSocketImpl。?开发./jdk-13.0.2.jdk/Contents/Home/bin/java-XX:+TraceClassLoadingTest.java|grepSocketImpl[0.699s][info][class,load]java.net.SocketImpl来源:jrt:/java.base[0.699s][info][class,load]java.net.SocketImpl$$Lambda$173/0x0000000800c37440来源:java.net.SocketImpl[0.702s][info][class,load]sun.net.PlatformSocketImpl来源:jrt:/java.base[0.702s][info][class,load]sun.nio.ch。NioSocketImplsource:jrt:/java.base[0.713s][info][class,load]sun.nio.ch.NioSocketImpl$FileDescriptorClosersource:jrt:/java.base但在Java12中并不是NioSocketImpl。?开发./jdk-12.0.2.jdk/Contents/Home/bin/java-XX:+TraceClassLoadingTest.java|grepSocketImpl[0.665s][info][class,load]java.net.SocketImpl来源:jrt:/java.base[0.665s][info][class,load]java.net.AbstractPlainSocketImpl来源:jrt:/java.base[0.665s][info][class,load]java.net.PlainSocketImpl来源:jrt:/java.base[0.665s][info][class,load]java.net.SocksSocketImpl来源:jrt:/java.base[0.666s][info][class,load]java.net.AbstractPlainSocketImpl$1来源:jrt:/java.base4。JEP354:SwitchExpressions(SecondPreview)为什么你不愿意使用switch表达式?我想其中一个原因应该是switch表达式的代码不够美观优雅,甚至有些冗长。例如像下面的例子。packagecom.wdbyte;publicclassJava13Switch{publicstaticvoidmain(String[]args){//传入月份,输出该月份所属的季节System.out.println(switchJava12Before("march"));}publicstaticStringswitchJava12Before(Stringmonth){Stringreuslt=null;开关(月){案例“三月”:案例“四月”:案例“五月”:reuslt=“春天”;休息;案例“六月”:案例“七月”:案例“八月”:reuslt=“夏季”;休息;案例“九月”:案例“十月”:案例“十一月”:reuslt=“秋天”;休息;案例“十二月”:案例“一月”:案例“二月”:reuslt=“冬季”;休息;}返回结果;}}在Java12中,switch得到了改进,可以用castL->expression来操作,并且可以有返回值,这样代码更好用,但这在Java12中是一个预览特性。//通过传入月份,输出该月份所属的季节publicstaticStringJava12(Stringmonth){returnswitch(month){case"march","april","may"->"spring";case"june","july","august"->"summer";case"september","october","november"->"autumn";case"十二月","一月","二月"->"冬天";默认->“月份错误”;};}延伸阅读:Java12新特性介绍,JEP325:switch表达式而现在,在Java13中,switch表达式得到了增强,返回值增加了yield关键字,相比break,语义更清晰.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";默认值:产生“月份错误”;};}5。JEP355:文本块(预览版)在此之前,如果我们将JSON分配给字符串:Stringcontent="{\n"+"\"upperSummary\":null,\n"+"\"sensitiveTypeList\":null,\n"+"\"gmtModified\":\"2011-08-0510:50:09\",\n"+"\"lowerGraph\":null,\n"+"\"signature\":\"\",\n"+"\"appName\":\"xxx\",\n"+"\"lowerSummary\":null,\n"+"\"gmtCreate\":\""2011-08-0510:50:09\",\n"+"\"type\":\"CALL\",\n"+"\"name\":\"xxxx\",\n"+"\"subType\":\"yyy\",\n"+"\"id\":1,\n"+"\"projectId\":1,\n"+"\"status\":1\n"+"}";最后,您不必编写难看的长字符串。从Java13开始,您可以使用文本块来定义字符串。Stringcontent2="""{"upperSummary":null,"sensitiveTypeList":null,"gmtModified":"2011-08-0510:50:09","lowerGraph":null,"signature":"","appName":"xxx","lowerSummary":null,"gmtCreate":"2011-08-0510:50:09","type":"CALL","name":"xxxx","subType":"yyy","id":1,"projectId":1,"status":1}""";但是,这是一个预览功能。如果在Java13中使用,需要手动开启预览功能。该功能将在Java15正式发布,想要试用的可以下载最新版本,尽情享受吧。参考http://openjdk.java.net/proje...https://nipafx.dev/java-appli...https://www.wdbyte.com/2020/0...https://mkyong.com/java/what-...Java新特性教程相关阅读Java12新特性介绍Java11新特性介绍Java10新特性介绍Java9新特性介绍Java8函数接口UnaryOperatorJava8函数接口BiPredicateJava8函数接口BiFunctionJava8函数接口SupplierJava8函数接口PredicateJava8函数接口FunctionJava8新特性——forEach遍历Java8新特性——LocalDate、LocalDateTime时间处理介绍Java8新特性——使用Optional优雅地处理空指针Java8新特性——Lambda表达式、函数在界面上了解Java8的新特性——强大的Stream操作手势,但不要学习Java7的新特性——告别低效的IO,Files、Paths、Path文件操作介绍Java7的新特性——新特性——快来补一波Java7语法特性<完>Helloworld:)我是Alan,一线技术工具人,认真写文章。喜欢的人都是有才华的,不仅长得帅气,说话也好听。文章持续更新中,可以关注公众号“程序猿艾伦”或访问“未读代码博客”。回复【资料】里面有我准备的各种系列的知识点和必读书籍。本文已收录于Github.com/niumoo/JavaNotes。知识点多,系列文章多。欢迎来到星空。