Java11的新特性

Java語言特性系列

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

版本號

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穩步推動Specification for JEP 181: Nest-based Access Control
簡單的理解就是Class類新增了getNestHost,getNestMembers方法
相關解讀 Specification for JEP 309: Dynamic Class-File Constants (JROSE EDITS)
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)HTTP Client Examples and Recipes,在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
容許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
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
有了這個特性,能夠直接java HelloWorld.java來執行java文件了,無需先javac編譯爲class文件而後再java執行class文件,兩步合成一步
經過JVMTI的SampledObjectAlloc回調提供了一個開銷低的heap分析方式
支持RFC 8446中的TLS 1.3版本
相關解讀 JDK11的ZGC小試牛刀一文讀懂Java 11的ZGC爲什麼如此高效
相關解讀 Oracle棄用Nashorn JavaScript引擎Oracle GraalVM announces support for Nashorn migration
廢除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以及90 New Features (and APIs) in JDK 11,這裏舉幾個例子。html

添加項

  • 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

doc

相關文章
相關標籤/搜索