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 是 Java 的交互式命令行。輸入/help 查看幫助。api
使用 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(); } }
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 類型無疑是 Java 中最經常使用的非基本類型,之前它的底層實現是用char[]
來存儲各個字符,這種方式致使一些 ASCII 碼須要佔用兩個字節來保存,由於一個 char 佔用 2 個字節。JDK9 中將 String 的底層實現改爲了byte[]
,一樣 StringBuilder 也進行了相同的變換。工具
告別鉛與火,走向光與電。之前的 Java 建立集合對象只能不停地 add,如今能夠直接使用 of。須要注意,使用 of 建立的集合是隻讀的,嘗試修改它們會拋出異常java.lang.UnsupportedOperationException
。 List.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")); } }
(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,用於傳輸網頁的協議,早在 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()); } }
https://www.cnblogs.com/peter1018/p/9209951.html