- 模塊化系統
- 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
便可進入交互界面緣由是 JDK
的 bin
目錄下有 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 個新的方法,dropWhile
、 takeWhile
、ofNullable
、 還有個 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); }