Java 13中的新功能
最后修改:1月18日,2021年
1.概述
2019年9月,JDK 13发布了,按照Java的新发布周期为6个月。在本文中,我们将看看这个版本中引入的新特性和改进。
2.预览开发人员功能
Java 13已经引入了两种新语言功能,尽管预览模式。这意味着这些功能完全实现了用于评估的开发人员,但也不是生产的。此外,它们可以在基于反馈的未来版本中删除或永久删除或永久。
我们需要指定-Enable-preview.作为命令行标志以使用预览功能。让我们深入了解一下它们。
2.1。切换表达式(JEP 354)
我们最初看到了switch表达式JDK 12.。java 13的开关表达式在以前的版本的基础上添加一个新的收益率声明。
使用收益率,我们现在可以有效地从switch表达式返回值:
@test @suppresswarnings(“preview”)public void whenswitchingonoperationsquareme_thenwillreturnsquare(){var me = 4;var操作=“squareme”;var结果=切换(操作){case“doubleme” - > {产量我* 2;}案例“squareme” - > {得到我*我;}默认 - >我;};assertequals(16,结果);}
正如我们所看到的,现在很容易实现战略模式使用新的开关。
2.2。文本块(中355)
第二个预览功能是文本块对多行细绳例如,嵌入式JSON, XML, HTML等。
早些时候,在我们的代码中嵌入JSON,我们会将其声明为一个细绳文字:
字符串json_string =“{\ r \ n”+“\”name \“:\”baeld金宝搏188体育ung \“,\ r \ n”+“\”网站“:\”https://www.%s.com/“\ r \ n”+“}”;
现在让我们使用相同的JSON使用细绳文本块:
字符串TEXT_BLOCK_JSON = """ { " 名称”:“Baeldu金宝搏188体育ng”、“网站”:“https://www.%s.com/“}””;
显然,不需要转义双引号或添加回车。通过使用文本块,嵌入的JSON编写起来更简单,阅读和维护起来也更容易。
而且,所有细绳功能可用:
@Test public void whenTextBlocks_thenStringOperationsWorkSame() {assert (TEXT_BLOCK_JSON.contains("Bael金宝搏188体育dung")). itrue ();为了(TEXT_BLOCK_JSON.indexOf(“www”)).isGreaterThan (0);为了(TEXT_BLOCK_JSON.length ()) .isGreaterThan (0);}
同时,以现在有三种新方法来操纵文本块:
- tiblindent()- 模仿编译器以删除附带的空白空间
- translateescapes()- 翻译逃生序列,如“t \ \”至“t \”
- 格式化()- 与之一样字符串::格式,但是对于文本块
让我们快点看看字符串::格式化例子:
assertthat(text_block_json.formatted(“金宝搏188体育baeldung”)。包含(“www.soft30t.com”))。Istrue();asserthat(string.format(json_string,“b金宝搏188体育aeldung”)。包含(“www.soft30t.com”))。Istrue();
由于文本块是预览功能,并且可以在将来的版本中删除,因此这些新方法标记为弃用。
3.动态CDS档案(JEP 350)
类数据共享(CDS)一直是Java Hotspot VM的突出功能。它允许类元数据以不同的JVM共享,以减少启动时间和内存占用空间。JDK 10通过添加应用程序CD来扩展此功能(AppCDS) -让开发者能够在共享存档中包含应用程序类。JDK 12进一步增强了这个特性默认的CDS档案。
但是,归档应用程序类的过程令人疑惑。要生成存档文件,开发人员必须尝试运行其应用程序以先创建类列表,然后将其转储到存档中。之后,该存档可用于共享JVM之间的元数据。
和动态存档JDK 13简化了这个过程。现在我们可以在应用程序退出时生成一个共享存档。这消除了对试运行的需求。
要启用应用程序在默认系统存档的顶部创建动态共享存档,我们需要添加一个选项- xx: ArchiveClassesAtExit并指定存档名称作为参数:
java -XX:ArchiveClassesAtExit= -cp AppName . exe
然后,我们可以使用新创建的存档来运行相同的应用程序- xx: SharedArchiveFile选择:
java -XX:SharedArchiveFile= -cp AppName . zip
4.ZGC: Uncommit Unused Memory (JEP 351)
这Z垃圾收集器在Java 11中引入了一个低延迟垃圾收集机制,使得GC暂停时间从未超过10毫秒。但是,与其他热点VM GCS(如G1和Shenandoah)不同,它没有配备将未使用的堆内存返回到操作系统。Java 13添加了此功能动作。
我们现在可以获得减少的内存足迹以及性能改进。
从Java 13开始默认情况下,ZGC现在将未提交的内存返回给操作系统,直到达到指定的最小堆大小。如果我们不想使用此功能,我们可以通过以下方式返回Java 11路:
- 使用选项- xx: -ZUncommit,或
- 设置相同的最小值(-XMS.)和最大值(-XMX.)堆大小
此外,ZGC现在支持的最大堆大小为16TB。早些时候,4TB是极限。
5.重新实现旧的Socket API (JEP 353)
我们已经看到了Socket (java.net.Socket和java.net.serversocket.自Java诞生以来,api就一直是Java不可或缺的一部分。然而,在过去的二十年里,他们从未实现现代化。它们是用遗留的Java和C编写的,既麻烦又难于维护。
Java 13折扣了这一趋势替换了底层实现使API与未来的用户模式线程保持一致。而不是PlainSocketImpl,提供者接口现在指向nioscoptimpl。这个新编码的实现基于与nio。
再次,我们确实有办法回去使用PlainSocketImpl。我们可以使用系统属性启动JVM-djdk.net.useplatesocketimpl.设置真正的使用旧的实现。默认值是nioscketimpl。
6.各种各样的变化
除了上面列出的JEPS之外,Java 13给了我们一些值得注意的变化:
- nio- 方法文件系统。newFileSystem(路径,Map < String, ? >)添加
- java.time.添加了新的日本官方纪元名
- javax.crypto-支持MS加密下一代(CNG)
- javax.security.——属性jdk.sasl.disablemberisms.添加以禁用SASL机制
- javax.xml.crypto- 新的细绳为表示规范XML 1.1 uri而引入的常量
- javax.xml.parsers.parsers.- 添加了使用名称空间支持的DOM和SAX工厂的新方法
- Unicode支持升级到版本12.1
- 增加了对Kerberos主体名规范化和跨领域引用的支持
此外,几个API是提出了取消。其中包括以下三种细绳上面列出的方法,以及javax.security.certAPI。
在删除中包括rmic.工具和javadoc工具的旧功能。Pre-JDK 1.4SocketImpl也不再支持实现。
7.结论
在本文中,我们看到了Java 13实施的所有五个JDK增强建议。我们还列出了一些其他值得注意的补充和删除。
像往常一样,源代码可用在GitHub。