Java語(yǔ)言特性系列
序
本文主要講述一下Java11的新特性
版本號(hào)
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
特性列表
相關(guān)解讀Java Nestmate穩(wěn)步推進(jìn)睛低,Specification for JEP 181: Nest-based Access Control
簡(jiǎn)單的理解就是Class類(lèi)新增了getNestHost,getNestMembers方法
相關(guān)解讀Specification for JEP 309: Dynamic Class-File Constants (JROSE EDITS)
jvm規(guī)范里頭對(duì)Constant pool新增一類(lèi)CONSTANT_Dynamic
對(duì)于AArch64處理器改進(jìn)現(xiàn)有的string、array相關(guān)函數(shù)钱雷,并新實(shí)現(xiàn)java.lang.Math的sin骂铁、cos、log方法
引入名為Epsilon的垃圾收集器罩抗,該收集器不做任何垃圾回收拉庵,可用于性能測(cè)試、短生命周期的任務(wù)等套蒂,使用-XX:+UseEpsilonGC開(kāi)啟
將java9標(biāo)記廢棄的Java EE及CORBA模塊移除掉钞支,具體如下:(1)xml相關(guān)的,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這幾個(gè)模塊欢唾;(2)java.corba且警,java.se.ee,java.activation礁遣,java.transaction被移除斑芜,但是java11新增一個(gè)java.transaction.xa模塊
相關(guān)解讀java9系列(六)HTTP/2 Client (Incubator),HTTP Client Examples and Recipes祟霍,在java9及10被標(biāo)記incubator的模塊jdk.incubator.httpclient押搪,在java11被標(biāo)記為正式,改為java.net.http模塊浅碾。
相關(guān)解讀New Java 11 Language Feature: Local-Variable Type Inference (var) extended to Lambda Expression Parameters
允許lambda表達(dá)式使用var變量大州,比如(var x, var y) -> x.process(y),如果僅僅是這樣寫(xiě)垂谢,倒是無(wú)法看出寫(xiě)var有什么優(yōu)勢(shì)而且反而覺(jué)得有點(diǎn)多此一舉厦画,但是如果要給lambda表達(dá)式變量標(biāo)注注解的話(huà),那么這個(gè)時(shí)候var的作用就突顯出來(lái)了(@Nonnull var x, @Nullable var y) -> x.process(y)
使用RFC 7748中描述的Curve25519和Curve448實(shí)現(xiàn)key agreement
升級(jí)現(xiàn)有的API滥朱,支持Unicode10.0.0
相關(guān)解讀Java 11 Features: Java Flight Recorder
Flight Recorder以前是商業(yè)版的特性根暑,在java11當(dāng)中開(kāi)源出來(lái),它可以導(dǎo)出事件到文件中徙邻,之后可以用Java Mission Control來(lái)分析排嫌。可以在應(yīng)用啟動(dòng)時(shí)配置java -XX:StartFlightRecording缰犁,或者在應(yīng)用啟動(dòng)之后淳地,使用jcmd來(lái)錄制怖糊,比如
$ jcmd <pid> JFR.start
$ jcmd <pid> JFR.dump filename=recording.jfr
$ jcmd <pid> JFR.stop
實(shí)現(xiàn) RFC 7539的ChaCha20 and ChaCha20-Poly1305加密算法
相關(guān)解讀Launch Single-File Source-Code Programs in JDK 11
有了這個(gè)特性,可以直接java HelloWorld.java來(lái)執(zhí)行java文件了颇象,無(wú)需先javac編譯為class文件然后再java執(zhí)行class文件伍伤,兩步合成一步
通過(guò)JVMTI的SampledObjectAlloc回調(diào)提供了一個(gè)開(kāi)銷(xiāo)低的heap分析方式
支持RFC 8446中的TLS 1.3版本
相關(guān)解讀JDK11的ZGC小試牛刀,一文讀懂Java 11的ZGC為何如此高效
相關(guān)解讀Oracle棄用Nashorn JavaScript引擎遣钳,Oracle GraalVM announces support for Nashorn migration
廢除Nashorn javascript引擎扰魂,在后續(xù)版本準(zhǔn)備移除掉,有需要的可以考慮使用GraalVM
廢除了pack200以及unpack200工具以及java.util.jar中的Pack200 API蕴茴。Pack200主要是用來(lái)壓縮jar包的工具劝评,不過(guò)由于網(wǎng)絡(luò)下載速度的提升以及java9引入模塊化系統(tǒng)之后不再依賴(lài)Pack200,因此這個(gè)版本將其移除掉倦淀。
細(xì)項(xiàng)解讀
上面列出的是大方面的特性付翁,除此之外還有一些api的更新及廢棄,主要見(jiàn)What's New in JDK 11 - New Features and Enhancements以及90 New Features (and APIs) in JDK 11晃听,這里舉幾個(gè)例子。
添加項(xiàng)
- 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類(lèi)新增toArray(IntFunction)的default方法砰识,可以直接通過(guò)傳入IntFunction告知要轉(zhuǎn)換的目標(biāo)類(lèi)型
- 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對(duì)String類(lèi)新增了strip能扒,stripLeading以及stripTrailing方法,除了strip相關(guān)的方法還新增了isBlank辫狼、lines初斑、repeat(int)等方法
- 添加了Google Trust Services GlobalSign Root Certificates
- 添加了GoDaddy Root Certificates
- 添加了T-Systems, GlobalSign and Starfield Services Root Certificates
- 添加了Entrust Root Certificates
移除項(xiàng)
- 移除了com.sun.awt.AWTUtilities
- 移除了sun.misc.Unsafe.defineClass,使用java.lang.invoke.MethodHandles.Lookup.defineClass來(lái)替代
- 移除了Thread.destroy()以及 Thread.stop(Throwable)方法
- 移除了sun.nio.ch.disableSystemWideOverlappingFileLockCheck膨处、sun.locale.formatasdefault屬性
- 移除了jdk.snmp模塊
- 移除了javafx见秤,openjdk估計(jì)是從java10版本就移除了,oracle jdk10還尚未移除javafx真椿,而java11版本則oracle的jdk版本也移除了javafx
- 移除了Java Mission Control鹃答,從JDK中移除之后,需要自己?jiǎn)为?dú)下載
- 移除了這些Root Certificates :Baltimore Cybertrust Code Signing CA突硝,SECOM 测摔,AOL and Swisscom
廢棄項(xiàng)
- 廢棄了Nashorn JavaScript Engine
- 廢棄了-XX+AggressiveOpts選項(xiàng)
- -XX:+UnlockCommercialFeatures以及-XX:+LogCommercialFeatures選項(xiàng)也不再需要
- 廢棄了Pack200工具及其API
小結(jié)
- java11是java改為6個(gè)月發(fā)布一版的策略之后的第一個(gè)LTS(
Long-Term Support
)版本(oracle版本才有LTS
),這個(gè)版本最主要的特性是:在模塊方面移除Java EE以及CORBA模塊解恰,在JVM方面引入了實(shí)驗(yàn)性的ZGC锋八,在API方面正式提供了HttpClient類(lèi)。 - 從java11版本開(kāi)始护盈,不再單獨(dú)發(fā)布JRE或者Server JRE版本了挟纱,有需要的可以自己通過(guò)jlink去定制runtime image
doc
- JDK11
- JDK11 Features
-
Introducing Java SE 11(
官方解讀
) -
JDK 11 Release Notes(
官方細(xì)項(xiàng)解讀
) - What is new in Java 11 ?
- Java Nestmate穩(wěn)步推進(jìn)
- 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