Java 9新特性

一、jdk 目錄結構

JDK9 具體目錄結構以下所示:html

bin: 該目錄包含全部的命令。 conf: 包含用戶能夠編輯的配置文件,例如之前位於 jre\lib 目錄中的.properties 和 .policy 文件。 include: 包含一些編譯本地代碼時使用的 C/C++頭文件。 jmods: 包含 JMOD 格式的平臺模塊,建立自定義運行映射時須要它。 legal: 包含法律聲明。 lib: 包含非 Windows 平臺上動態連接的本地庫,其子目錄和文件不該由開發人員直接編輯或使用。Windows 平臺的動態連接庫直接放在了 bin 目錄下。注:JDK9 目錄中再也不有 jre 子目錄,之前 JDK 和 JRE 是分開的,兩者主要區別在於 JRE 只提供運行環境,而 JDK 額外提供了 Java 編譯器。java

二、模塊化

module-info.java:該文件必須位於項目的根目錄中。該文件用於定義模塊須要什麼依賴,以及那些包被外部使用。 exports:控制着那些包能夠被其餘模塊訪問到,全部不被 exports 的包默認都被封裝在模塊裏面不被外界所使用。 requires:指明對其餘模塊的依賴。shell

三、JShell

JShell 是 Java 的交互式命令行。輸入/help 查看幫助。api

四、多版本兼容 jar

使用 javac、jar 等命令能夠以任意版本編譯、打包 Java 代碼。服務器

五、接口支持私有方法

Java8 以前接口只能定義方法的聲明,這些方法都是共有的,接口的實現類必須實現這些方法。 Java8 中接口可使用 default 關鍵字定義默認方法,這樣接口的實現類即使不實現這些方法也不會報錯。這個改進能夠大大減小 Java 中 AbstractClass 的數量。 Java9 中接口可使用 private 關鍵字定義私有方法,這樣接口的默認方法就能夠把邏輯放到私有方法中。接口的實現類沒法訪問接口的私有方法。併發

public class Haha {
interface Animal {
    //Java8提供了默認方法,卻沒有提供私有方法,這就十分腦殘
    default void shout() {
        this.realShout();
    }

    //接口只能定義default方法和私有方法,不能什麼都不寫
    //void run(){}

    //Java9接口終於提供了私有方法,以供默認方法調用
    private void realShout() {
        System.out.println("我該怎麼叫?");
    }
}
static class Dog implements Animal {
    //沒法重寫realShout,只能重寫shout
    @Override
    public void shout() {
        System.out.println("汪汪汪");
    }
}
public static void main(String[] args) {
    Dog d = new Dog();
    d.shout();
}
}

六、改進 try-with-resources

Java8 之前爲了關閉打開的資源,須要寫不少 finally 代碼。 Java8 提供了加強的 try 語句,可讓 try 中的資源在拋出異常時或者正常結束時自動關閉資源。 Java9 進一步加強 try 語句,try 中能夠指明讓 try 接管的資源。ide

import java.io.Closeable;
import java.io.IOException;

class Haha {
static class Resource implements Closeable {
    @Override
    public void close() throws IOException {
        System.out.println("I am closed");
    }
}

public static void main(String[] args) {
    //java8中只能把資源定義在try語句中
    try (Resource r1 = new Resource(); Resource r2 = new Resource()) {

    } catch (IOException e) {
        e.printStackTrace();
    }
    //Java9中資源能夠放在try外面
    Resource r3 = new Resource();
    Resource r4 = new Resource();
    try (r3; r4) {

    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

七、加強鑽石運算符

這個特性其實是更增強大的自動類型推導機制。模塊化

Set<String> a = new HashSet<>() {
    @Override
    public boolean add(String s) {
        return super.add(s);
    }
};

八、限制使用下劃線標識符

在 Java 中,_$都是合法的標識符。但從 JDK9 開始,_成爲不合法的標識符。函數

九、更省內存的 String 實現

String 類型無疑是 Java 中最經常使用的非基本類型,之前它的底層實現是用char[]來存儲各個字符,這種方式致使一些 ASCII 碼須要佔用兩個字節來保存,由於一個 char 佔用 2 個字節。JDK9 中將 String 的底層實現改爲了byte[],一樣 StringBuilder 也進行了相同的變換。工具

十、集合的 of 函數快速建立集合

告別鉛與火,走向光與電。之前的 Java 建立集合對象只能不停地 add,如今能夠直接使用 of。須要注意,使用 of 建立的集合是隻讀的,嘗試修改它們會拋出異常java.lang.UnsupportedOperationExceptionList.of()Set.of()接受的變量類型會自動求類型的最近公共祖先,在 Java 中一切對象皆爲 Object,整個類型系統能夠視爲一棵樹。Map.of()接受的變量類型是交替的 K、V 對,對於K和V會分別計算最近公共祖先。

import java.util.List;
import java.util.Map;
import java.util.Set;

class Haha {

public static void main(String[] args) {
    List<String> a = List.of("one", "two", "three");
    //a.add("four");//java.lang.UnsupportedOperationException
    System.out.println(a);
    System.out.println(List.of("one two three".split("\\s+")));
    System.out.println(Set.of("one two three".split("\\s")));
    System.out.println(Map.of(1, "one", 2, "two", 3, "three"));
}
}

十一、加強的stream API

(1)takeWhile
從第一個元素開始,一直到不知足條件爲止。

List<Integer> list = Arrays.asList(45,43,76,87,42,77,90,73,67,88);
list.stream().takeWhile((x) -> x < 80 ).forEach(System.out::println);

(2)dropWhite
從第一個元素開始,若是知足條件則忽略該元素,一直到不知足該條件纔開始接受元素。
(3)ofNullable
之前Stream不能徹底爲null,JDK9中能夠了。

//NullPointerException
//Stream<Object> stream1 = Stream.of(null);
//System.out.println(stream1.count());
//不報異常  容許這樣寫
Stream<String> stringStream = Stream.of("AA", "BB", null);
System.out.println(stringStream.count());
//不報異常  容許這樣寫
List<String> list = new ArrayList<>();
list.add("A");
list.add(null);
System.out.println(list.stream().count());
//ofNullable() :容許值爲 null
Stream<Object> stream = Stream.ofNullable(null);
System.out.println(stream.count());
Stream<String> stream2 = Stream.ofNullable("Hello World");
System.out.println(stream2.count());

(4)iterate
iterate能夠充當循環用,在JDK8中iterate須要配合limit做爲終止條件,這樣不夠靈活。JDK9中提供了相似for的形式iterate函數重載。

//JDK8 使用iterate方法,需配合limit截止。
Stream.iterate(1, (x) -> x + 1).limit(10).forEach(System.out::print);
System.out.println();
//JDK9 使用iterate的重載方法能夠直接使用Predicate來截止。
Stream.iterate(1,(x) -> x <= 10, (x) -> x + 1).forEach(System.out::print);

十二、全新的HTTP客戶端API

HTTP,用於傳輸網頁的協議,早在 1997 年就被採用在目前的 1.1版本中。直到 2015 年,HTTP2 才成爲標準。

HTTP/1.1和HTTP/2的主要區別是如何在客戶端和服務器之間構建和傳輸數據。HTTP/1.1 依賴於請求/響應週期。 HTTP/2 容許服務器「push」數據:它能夠發送比客戶端請求更多的數據。 這使得它能夠優先處理併發送對於首先加載網頁相當重要的數據。

Apache的HTTP Client能夠被淘汰了,Java標準庫愈來愈強大。

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

class Haha {
public static void main(String[] args) throws IOException, InterruptedException {
    HttpClient cli = HttpClient.newHttpClient();
    HttpResponse<String> res = cli.send(HttpRequest.newBuilder().GET().uri(URI.create("https://www.cnblogs.com")).build(), HttpResponse.BodyHandlers.ofString());
    System.out.println(res.body());
}
}

其它

  • java.awt.image新增多分辨率API。
  • 改進的Optional類
  • 統一的 JVM 日誌系統
  • 智能 JAVA 編譯工具
  • Javadoc 的 HTML5 支持
  • Java 動態編譯器

參考資料

https://www.cnblogs.com/peter1018/p/9209951.html

相關文章
相關標籤/搜索