JDK9的這些新特徵你知道嗎?

  • 模塊化系統
  • jShell命令
  • 接口的私有方法
  • 鑽石操做符的使用升級
  • 垃圾收集機制
  • 語法改進:try語句
  • String存儲結構變動
  • 建立只讀集合
  • 加強的Stream API

1,Java平臺模塊化系統:

引入了一種新的Java編程組件模塊,它是一個命名的、自描述的代碼和數據集合。本質上說,模塊(module)的概念,其實就是 package 外再包裹一層,也就是說,用模塊來管理各個 package ,經過聲明某個 package 暴露,不聲明默認就是隱藏。所以模塊化是的代碼組織上更安全,由於它能夠指定哪些部分暴露,哪些部分隱藏。java

過程:shell

① 建立一個 java9demo 的工程,而後在這個工程下面建立 2 個 module。一個 java9A ,一個 java9B編程

② 在 java9A 中建立一個實體類 Person,而後想在 java9B 中引用它,正常狀況下是引用不到的,由於是存在兩個模塊中。安全

③ 咱們在 java9A 模塊的 src 目錄下新建 module-info.java 文件(這個文件就是所謂的模塊化文件)session

module java9A {
 // 這裏 exports 後面跟具體的包名
 exports com.hepingfly.bean;
}

④ 咱們在 java9B 模塊的 src 目錄下新建 module-info.java 文件模塊化

module java9demo {
 // requires 後面跟具體要引入的 module 的名字
 requires java9A;
}

⑤ 這樣在 java9B 模塊中就能引用 java9A 模塊暴露出來的實體類了。函數

public class ModuleTest {
 // 我在 java9B 模塊中想引用 java9A 模塊中的 Person 類
 public static void main(String[] args) {
        Person person = new Person();
        person.setName("hepingfly");
        System.out.println(person.getName());   // 打印 hepingfly
    }
}

模塊化系統是基於jar包之間存在的,目的在於儘量的減小jar中多餘類的加載,保證總體項目運行時的效率,對於項目運行確定有必定的積極意義。工具

二、JShell:

它表示 Java Shell,是你們熟知的 REPL (讀取-執行-打印-循環) 形式。利用 jshell 能夠在沒有建立類的狀況下直接聲明變量,計算表達式,執行語句。即開發時能夠在命令行裏直接運行 Java 代碼,無需建立 Java 文件。ui

基本使用:命令行

① JDK9 以上的版本若是你配置好了環境變量直接在命令行輸入 jshell 便可進入交互界面緣由是 JDKbin 目錄下有 jshell 這個工具)

② 輸入命令得到幫助信息

【jshell> /help intro】輸入 /help intro得到一些幫助信息

③ 定義變量,計算變量值

④ 定義方法,調用方法

⑤ 導入指定的包

【jshell> import java.util.*】能夠經過import命令導入指定的包

【jshell> /imports】查看默認導入了哪些包

⑥ 列出當前 session 內全部有效的代碼片斷

【jshell> /list】判斷當前session內全部有效的代碼片斷

⑦ 查看當前 session 下全部建立過的變量

【jshell> /var】

⑧ 查看當前 session 下全部建立過的方法

【jshell> /methods】

⑨ 從外部文件加載源代碼

源代碼:

// hello.java 文件中的內容
public void hello() {
 System.out.println("hello hepingfly");
}
hello();

⑩ 退出 jshell

【jshell> /exit】

注:

  • jshell 可使用 tab 鍵進行自動補全
  • jshell 能夠從文件中加載語句或者將語句保存到文件中
  • 在 jshell 中定義相同方法名和參數列表的方法,即爲對現有方法的覆蓋。
  • 在 jshell 中你會發現不會出現編譯時異常,由於 jshell 幫你隱藏了。

3,接口的私有方法:

jdk9,容許在接口中使用私有方法。在 Java9 中,接口更加靈活和強大,方法的訪問權限修飾符能夠聲明爲 private 的了,此時方法將不會成爲你對外暴露的 API 的一部分。

//jdk9:聲明私有方法
private void method4(){
     System.out.println("私有方法");
}

4,鑽石操做符的使用升級

java9 添加了匿名內部類的功能 後面添加了大括號{} 能夠作一些細節的操做

Map<String,String> map9 = new HashMap<>(){};

5,垃圾收集機制

Java 9 移除了在 Java 8 中 被廢棄的垃圾回收器配置組合(DefNew + CMS,ParNew + SerialOld,Incremental CMS)

同時把G1設爲默認的垃圾回收器實現。替代了以前默認使用的Parallel GC

JVM 有了統一的日誌記錄系統,可使用新的命令行選項-Xlog 來控制 JVM 上 全部組件的日誌記錄。該日誌記錄系統能夠設置輸出的日誌消息的標籤、級別、修飾符和輸出目標等。

6,語法改進:try語句

在 Java9 中能夠在 try 子句中使用已經初始化過的資源。

public void testJava() {
         /**
          * 能夠在 try 後面的小括號中調用已經實例化好的資源對象
          * 多個資源對象以分號分隔
          */
         InputStreamReader is = new InputStreamReader(System.in);
         OutputStreamWriter os = new OutputStreamWriter(System.out);
         try (is;os) {
             System.out.println(is.read());
         } catch (Exception e) {
             e.printStackTrace();
         }
     }

7,String存儲結構變動

String的實現底層由char[] 改成byte[],存儲效率變高,調用效率一樣變高

@Stable
private final byte[] value;

8,建立只讀合集

public static void testJava() {
    // 建立一個只讀的 list
    List<String> list = List.of("heping", "fly");
    // 建立一個只讀的 set
    Set<String> set = Set.of("heping", "fly");
    // 建立一個只讀的 map
    Map<String, String> map = Map.of("name", "heping", "age", "18");
    Map<String, String> map2 = Map.ofEntries(Map.entry("name", "heping"), Map.entry("age", "12"));
}

9,加強的Stream API

在 Java9 中,Stream API 變的更好,Stream 接口中添加了 4 個新的方法,dropWhiletakeWhileofNullable 、 還有個 iterator 方法的新重載方法。

  • takeWhile :用於從 Stream 中獲取一部分數據,接收一個 predicate 來進行選擇。在有序的 Stream 中,takeWhile 返回從開頭開始的儘可能多的元素。

    public static void test1() {
        List<Integer> list = Arrays.asList(13,11,45,18,20,16,96);
        Stream<Integer> stream = list.stream();
        stream.takeWhile((x) -> x < 20).forEach(System.out::println);
    }
  • dropWhile:與 takeWhile() 整好相反,dropWhile返回剩餘的元素。

    public static void test2() {
        List<Integer> list = Arrays.asList(13,11,45,18,20,16,96);
        Stream<Integer> stream = list.stream();
        stream.dropWhile((x) -> x < 20).forEach(System.out::println);
    }
  • ofNullable : 能夠包含一個非空元素,也能夠建立一個空 Stream 。

    public static void test3() {
        Stream<Integer> stream = Stream.of(1, 2, 3, null);
        stream.forEach(System.out::println);
        // 若是隻有單個元素,此元素不能爲 null,不然報空指針異常
        Stream<Object> stream1 = Stream.of(null);
        // Java9 新增 ofNullable 容許單個元素爲空
        Stream<Object> stream2 = Stream.ofNullable(null);
        System.out.println(stream2.count());   // 0
    }
  • iterate:重載的方法

    public static void test4() {
      // 須要經過 limit 來控制終止
      Stream.iterate(0, x -> x + 1).limit(10).forEach(System.out::println);
      // 這裏就能夠經過傳入一個斷言型函數來進行終止
      Stream.iterate(0, x -> x < 10, x -> x + 1).forEach(System.out::println);
    }
相關文章
相關標籤/搜索