Java语言特性系列
- Java5的新特性
- Java6的新特性
- Java7的新特性
- Java8的新特性
- Java9的新特性
- Java10的新特性
- Java11的新特性
- Java12的新特性
- Java13的新特性
序
本文主要讲述一下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
特性列表
- 181: Nest-Based Access Control
相关解读 Java Nestmate稳步推进, Specification for JEP 181: Nest-based Access Control
简单的理解就是Class类新增了getNestHost,getNestMembers方法
- 309: Dynamic Class-File Constants
相关解读 Specification for JEP 309: Dynamic Class-File Constants (JROSE EDITS)
jvm规范里头对Constant pool新增一类CONSTANT_Dynamic
- 315: Improve Aarch64 Intrinsics
对于AArch64处理器改进现有的string、array相关函数,并新实现java.lang.Math的sin、cos、log方法
- 318: Epsilon: A No-Op Garbage Collector
引入名为Epsilon的垃圾收集器,该收集器不做任何垃圾回收,可用于性能测试、短生命周期的任务等,使用-XX:+UseEpsilonGC开启
- 320: Remove the Java EE and CORBA Modules(
重磅
)
将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模块
- 321: HTTP Client (Standard)(
重磅
)
相关解读 java9系列(六)HTTP/2 Client (Incubator), HTTP Client Examples and Recipes,在java9及10被标记incubator的模块jdk.incubator.httpclient,在java11被标记为正式,改为java.net.http模块。
- 323: Local-Variable Syntax for Lambda Parameters
相关解读 New Java 11 Language Feature: Local-Variable Type Inference (var) extended to Lambda Expression Parameters
允许lambda表达式使用var变量,比如(var x, var y) -> x.process(y),如果仅仅是这样写,倒是无法看出写var有什么优势而且反而觉得有点多此一举,但是如果要给lambda表达式变量标注注解的话,那么这个时候var的作用就突显出来了(@Nonnull var x, @Nullable var y) -> x.process(y)
- 324: Key Agreement with Curve25519 and Curve448
使用RFC 7748中描述的Curve25519和Curve448实现key agreement
- 327: Unicode 10
升级现有的API,支持Unicode10.0.0
- 328: Flight Recorder
相关解读 Java 11 Features: Java Flight Recorder
Flight Recorder以前是商业版的特性,在java11当中开源出来,它可以导出事件到文件中,之后可以用Java Mission Control来分析。可以在应用启动时配置java -XX:StartFlightRecording,或者在应用启动之后,使用jcmd来录制,比如
$ jcmd JFR.start
$ jcmd JFR.dump filename=recording.jfr
$ jcmd JFR.stop
- 329: ChaCha20 and Poly1305 Cryptographic Algorithms
实现 RFC 7539的ChaCha20 and ChaCha20-Poly1305加密算法
- 330: Launch Single-File Source-Code Programs(
重磅
)
相关解读 Launch Single-File Source-Code Programs in JDK 11
有了这个特性,可以直接java HelloWorld.java来执行java文件了,无需先javac编译为class文件然后再java执行class文件,两步合成一步
- 331: Low-Overhead Heap Profiling
通过JVMTI的SampledObjectAlloc回调提供了一个开销低的heap分析方式
- 332: Transport Layer Security (TLS) 1.3(
重磅
)
支持RFC 8446中的TLS 1.3版本
- 333: ZGC: A Scalable Low-Latency Garbage Collector(Experimental)(
重磅
)
相关解读 JDK11的ZGC小试牛刀, 一文读懂Java 11的ZGC为何如此高效
- 335: Deprecate the Nashorn JavaScript Engine
相关解读 Oracle弃用Nashorn JavaScript引擎, Oracle GraalVM announces support for Nashorn migration
废除Nashorn javascript引擎,在后续版本准备移除掉,有需要的可以考虑使用GraalVM
- 336: Deprecate the Pack200 Tools and API
废除了pack200以及unpack200工具以及java.util.jar中的Pack200 API。Pack200主要是用来压缩jar包的工具,不过由于网络下载速度的提升以及java9引入模块化系统之后不再依赖Pack200,因此这个版本将其移除掉。
细项解读
上面列出的是大方面的特性,除此之外还有一些api的更新及废弃,主要见What's New in JDK 11 - New Features and Enhancements以及90 New Features (and APIs) in JDK 11,这里举几个例子。
添加项
- Collection.toArray(IntFunction)
@Test
public void testCollectionToArray(){
Set 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
doc
- JDK11
- JDK11 Features
- Introducing Java SE 11(
官方解读
) - JDK 11 Release Notes(
官方细项解读
) - What is new in Java 11 ?
- Java Nestmate稳步推进
- Specification for JEP 181: Nest-based Access Control
- Specification for JEP 309: Dynamic Class-File Constants (JROSE EDITS)
- Java 11 Features: Java Flight Recorder
- java9系列(六)HTTP/2 Client (Incubator)
- Java 11: Standardized HTTP Client API
- java.net.http javadoc
- HTTP Client Examples and Recipes
- New Java 11 Language Feature: Local-Variable Type Inference (var) extended to Lambda Expression Parameters
- JDK11的ZGC小试牛刀
- 一文读懂Java 11的ZGC为何如此高效
- Oracle弃用Nashorn JavaScript引擎
- Oracle GraalVM announces support for Nashorn migration
- JDK 11: New Default Collection Method toArray(IntFunction)
- 90 New Features (and APIs) in JDK 11
- APIs To Be Removed from Java 11
- Java 11 String API Updates