Java 11语言新特性
更新时间 2021-07-08 14:50:19    浏览 0   

TIP

本文主要是介绍 Java 11语言新特性 。

本文主要讲述一下Java11的新特性

# 版本号

java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
  • General-Availability Release版本是基于tag为jdk-11+28的版本编译
  • 从version信息可以看出是build 11+28

# 特性列表

相关解读Java Nestmate稳步推进 (opens new window)Specification for JEP 181: Nest-based Access Control (opens new window) 简单的理解就是Class类新增了getNestHost,getNestMembers方法

相关解读Specification for JEP 309: Dynamic Class-File Constants (JROSE EDITS) (opens new window) jvm规范里头对Constant pool新增一类CONSTANT_Dynamic

对于AArch64处理器改进现有的string、array相关函数,并新实现java.lang.Math的sin、cos、log方法

引入名为Epsilon的垃圾收集器,该收集器不做任何垃圾回收,可用于性能测试、短生命周期的任务等,使用-XX:+UseEpsilonGC开启

将java9标记废弃的Java EE及CORBA模块移除掉,具体如下:(1)xml相关的,java.xml.ws, java.xml.bind,java.xml.ws,java.xml.ws.annotation,jdk.xml.bind,jdk.xml.ws被移除,只剩下java.xml,java.xml.crypto,jdk.xml.dom这几个模块;(2)java.corba,java.se.ee,java.activation,java.transaction被移除,但是java11新增一个java.transaction.xa模块

相关解读java9系列(六)HTTP/2 Client (Incubator) (opens new window)HTTP Client Examples and Recipes (opens new window),在java9及10被标记incubator的模块jdk.incubator.httpclient,在java11被标记为正式,改为java.net.http模块。

相关解读New Java 11 Language Feature: Local-Variable Type Inference (var) extended to Lambda Expression Parameters (opens new window) 允许lambda表达式使用var变量,比如(var x, var y) -> x.process(y),如果仅仅是这样写,倒是无法看出写var有什么优势而且反而觉得有点多此一举,但是如果要给lambda表达式变量标注注解的话,那么这个时候var的作用就突显出来了(@Nonnull var x, @Nullable var y) -> x.process(y)

使用RFC 7748中描述的Curve25519和Curve448实现key agreement

升级现有的API,支持Unicode10.0.0

相关解读Java 11 Features: Java Flight Recorder (opens new window) Flight Recorder以前是商业版的特性,在java11当中开源出来,它可以导出事件到文件中,之后可以用Java Mission Control来分析。可以在应用启动时配置java -XX:StartFlightRecording,或者在应用启动之后,使用jcmd来录制,比如

$ jcmd <pid> JFR.start
$ jcmd <pid> JFR.dump filename=recording.jfr
$ jcmd <pid> JFR.stop

实现 RFC 7539的ChaCha20 and ChaCha20-Poly1305加密算法

相关解读Launch Single-File Source-Code Programs in JDK 11 (opens new window) 有了这个特性,可以直接java HelloWorld.java来执行java文件了,无需先javac编译为class文件然后再java执行class文件,两步合成一步

通过JVMTI的SampledObjectAlloc回调提供了一个开销低的heap分析方式

支持RFC 8446中的TLS 1.3版本

相关解读JDK11的ZGC小试牛刀 (opens new window)一文读懂Java 11的ZGC为何如此高效 (opens new window)

相关解读Oracle弃用Nashorn JavaScript引擎 (opens new window)Oracle GraalVM announces support for Nashorn migration (opens new window) 废除Nashorn javascript引擎,在后续版本准备移除掉,有需要的可以考虑使用GraalVM

废除了pack200以及unpack200工具以及java.util.jar中的Pack200 API。Pack200主要是用来压缩jar包的工具,不过由于网络下载速度的提升以及java9引入模块化系统之后不再依赖Pack200,因此这个版本将其移除掉。

# 细项解读

上面列出的是大方面的特性,除此之外还有一些api的更新及废弃,主要见What's New in JDK 11 - New Features and Enhancements (opens new window)以及90 New Features (and APIs) in JDK 11 (opens new window),这里举几个例子。

# 添加项

  • Collection.toArray(IntFunction)
    @Test
    public void testCollectionToArray(){
        Set<String> names = Set.of("Fred", "Wilma", "Barney", "Betty");
        String[] copy = new String[names.size()];
        names.toArray(copy);
        System.out.println(Arrays.toString(copy));
        System.out.println(Arrays.toString(names.toArray(String[]::new)));
    }

Collection类新增toArray(IntFunction)的default方法,可以直接通过传入IntFunction告知要转换的目标类型

  • String.strip
    @Test
    public void testStrip(){
        String text = "  \u2000a  b  ";
        Assert.assertEquals("a  b",text.strip());
        Assert.assertEquals("\u2000a  b",text.trim());
        Assert.assertEquals("a  b  ",text.stripLeading());
        Assert.assertEquals("  \u2000a  b",text.stripTrailing());
    }

java11对String类新增了strip,stripLeading以及stripTrailing方法,除了strip相关的方法还新增了isBlank、lines、repeat(int)等方法

  • 添加了Google Trust Services GlobalSign Root Certificates
  • 添加了GoDaddy Root Certificates
  • 添加了T-Systems, GlobalSign and Starfield Services Root Certificates
  • 添加了Entrust Root Certificates

# 移除项

  • 移除了com.sun.awt.AWTUtilities
  • 移除了sun.misc.Unsafe.defineClass,使用java.lang.invoke.MethodHandles.Lookup.defineClass来替代
  • 移除了Thread.destroy()以及 Thread.stop(Throwable)方法
  • 移除了sun.nio.ch.disableSystemWideOverlappingFileLockCheck、sun.locale.formatasdefault属性
  • 移除了jdk.snmp模块
  • 移除了javafx,openjdk估计是从java10版本就移除了,oracle jdk10还尚未移除javafx,而java11版本则oracle的jdk版本也移除了javafx
  • 移除了Java Mission Control,从JDK中移除之后,需要自己单独下载
  • 移除了这些Root Certificates :Baltimore Cybertrust Code Signing CA,SECOM ,AOL and Swisscom

# 废弃项

  • 废弃了Nashorn JavaScript Engine
  • 废弃了-XX+AggressiveOpts选项
  • -XX:+UnlockCommercialFeatures以及-XX:+LogCommercialFeatures选项也不再需要
  • 废弃了Pack200工具及其API

# 小结

  • java11是java改为6个月发布一版的策略之后的第一个LTS(Long-Term Support)版本(oracle版本才有LTS),这个版本最主要的特性是:在模块方面移除Java EE以及CORBA模块,在JVM方面引入了实验性的ZGC,在API方面正式提供了HttpClient类。
  • 从java11版本开始,不再单独发布JRE或者Server JRE版本了,有需要的可以自己通过jlink去定制runtime image

# 参考文章

  • https://segmentfault.com/a/1190000016527932
更新时间: 2021-07-08 14:50:19
  0
手机看
公众号
讨论
左栏
全屏
上一篇
下一篇
扫一扫 手机阅读
可分享给好友和朋友圈