作者:木九天 《 Java9 新特性 詳解 》
Java9 新特性 詳解
摘要: 1.目錄結構 2.repl工具 jShell指令 3.子產品化 4.多版本相容jar包 5.接口方法的改進(在接口中 jdk7 隻能聲明全名常量和抽象方法 jdk8 添加了靜态方法和預設方法 jdk9添加了私有方法) 6.鑽石操作符更新 可以有{} 7.異常處理try更新 8.下劃線辨別符命名的限制 _ 不允許了 9.String底層存儲結構的變更(char數組變成byte位元組數組) 10.增強了Stream API(在java8基礎上,新增加4個方法) 11.jdk9 中引入httpClient api 代替原有的HttpURLConnection
1、Java9新特性之---目錄結構
包含jdk8及以前的jdk版本,所有目錄結構以及目錄含義如圖:

jdk9之後,目錄結構發生變化如圖:
這個新特性隻要了解下就可以了,這個目錄結構是友善為了接下來新特性做保證
2、Java9新特性之---JShell工具
怎麼了解,怎麼用呢?這個隻是針對于java9來說,相當于cmd工具,你可以和cmd一樣,直接寫方法等等,不過我認為隻是适用于初學者做一些最簡單的運算和寫一些方法:
在cmd中打開這個工具:
進入工具後可以做一些簡單的java操作
。。。。等等,我認為隻适用于初學者學習java不用其他編輯工具就可以學習java
3、Java9新特性之---子產品化
一個大型的項目,比如淘寶商城等,都會包含多個子產品,比如訂單子產品,前台子產品,背景管理子產品,廣告位子產品,會員子產品.....等等,各個子產品之間會互相調用,不過這種情況下會很少,隻針對特殊情況,如果一個項目有30個子產品系統進行開發,但是隻要某個單獨子產品運作時,都會帶動所有的子產品,這樣對于jvm來說在記憶體和性能上會很低,是以,java9提供了這一個特性,某一個子產品運作的時候,jvm隻會啟動和它有依賴的子產品,并不會加載所有的子產品到記憶體中,這樣性能大大的提高了。寫法上如下:
一個項目中的兩個子產品,子產品之間通過module-info.java來關聯,在IDEA編輯器右鍵建立package-info.java
在這個兩個子產品java9Demo和java9Test中,java9demo編寫一個實體類Person,在java9Test調用這樣一個過程
這個是java9Demo 将 java9Test 子產品需要的檔案導出 exports 把它所在的包導出
module java9Demo{
exports com.mdxl.layer_cj.entity;
}
然後在java9Test子產品中建立一個package-info.java,引入java9Demo子產品導出包名
module java9Test{
requires java9Demo;
}
這樣就可以直接在java9Test中引入Person實體類了,這隻是一個簡單的例子。exports 控制着那些包可以被子產品通路,是以不被導出的包不能被其他子產品通路
4、Java9新特性之---多版本相容Jar包
怎麼了解呢?
好多公司用的jdk大部分還是老版本,jdk6,7 都有,他們都不敢更新主要是因為相容的問題,但是java9做到了這一點,就是不管公司的項目是用的java6,7,8甚至5,他都可以相容不出錯,打個比方,你之前用的是iphone5,現在出現了iPhone6,iphone7,iphon8和iphone9,但是你不敢買9,因為你自己已經适應了iphone5的所有手機的運作流程,6,7,8每個手機的運作流程不一樣,但是這個9很強大,它能夠識别你現在所用的版本iphone是5,是以當你更新到iphone9的時候,你的這個手機運作流程還是iphone5的流程,隻是在原有基礎上擁有了更多的iphone9的所有優勢。
5、Java9新特性之---接口Interface的更新
public interface FilterProcess<T> {
//java 7 及以前 特性 全局常量 和抽象方法
public static final String a ="22";
boolean process(T t);
//java 8 特性 靜态方法和預設方法
default void love(){
System.out.println("java8 特性預設方法");
}
static void haha(){
System.out.println("java8 特性靜态方法");
}
//java 8 特性 支援私有方法
private void java9(){}
}
6、Java9新特性之---鑽石操作符的更新
//java6及以前
Map<String,String> map7 = new HashMap<String,String>();
//java7和8 <>沒有了資料類型
Map<String,String> map8 = new HashMap<>();
//java9 添加了匿名内部類的功能 後面添加了大括号{} 可以做一些細節的操作
Map<String,String> map9 = new HashMap<>(){};
7、Java9新特性之---異常處理try更新
首先看下jdk6,7,8,9 的try catch的比較
Java6處理方式:
//java7及以前寫法 每一個流打開的時候都要關閉
@Test
public void test7(){
InputStreamReader reader = null;
try{
reader = new InputStreamReader(System.in);
reader.read();
}catch (IOException e){
e.printStackTrace();
}finally {
if (reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
java7,8 共同的處理方式:
//java7和8及 每一個流打開的時候都要關閉,但是在try的括号中來進行關閉
@Test
public void test7(){
try(InputStreamReader reader =new InputStreamReader(System.in)){
reader.read();
}catch (IOException e){
e.printStackTrace();
}
}
java9的處理方式:
//java9及 每一個流打開的時候都要關閉,但是在try的括号中來進行關閉,在
//java8的基礎上進一步更新 直接在try括号中直接寫入 變量就好,如果有多個流,就用分号隔開
//try(reader;writer){}
@Test
public void test7(){
InputStreamReader reader =new InputStreamReader(System.in);
try(reader){
reader.read();
}catch (IOException e){
e.printStackTrace();
}
}
這下子應該一幕了然了吧
8、Java9新特性之---特殊辨別符增加限制
java8 之前 String _ ="hello"; 這樣的辨別符可以用,java9就用不到。
9、Java9新特性之---String底層存儲結構更換
java8之前 String的底層結構類型都是 char[] ,但是java9 就替換成 byte[] 這樣來講,更節省了空間和提高了性能
之是以替換是因為 之前一直是最小機關是一個char,用到兩個byte,但是java8是基于latin1的,而這個latin1編碼可以用一個byte辨別,是以當你資料明明可以用到一個byte的時候,我們用到了一個最小機關chat兩個byte,就多出了一個byte的空間。是以java9在這一方面進行了更新,現在的java9 是基于ISO/latin1/Utf-16 ,latin1和ISO用一個byte辨別,UTF-16用兩個byte辨別,java9會自動識别用哪個編碼,當資料用到1byte,就會使用iSO或者latin1 ,當空間資料滿足2byte的時候,自動使用utf-16,節省了很多空間
*****同理,StringBuilder StringBuffer也更換了底層資料結構*************
10、Java9新特性之---Stream API 新方法的添加
在原有Stream API 新添加了4個方法,takeWhile dropWhile ofNullable iterate(新重載方法)
首先解釋 takeWhile 當達到一定條件就結束:輸出結果為45 43,如圖
而 dropWhile 則和takeWhile 相反
ofNullable, 在java8中 Stream中的元素不能完全為null,否則空指針異常,而在java9的更新中,允許建立null
iterate 不加條件無線循環
11、Java9新特性之---引進HttpClient
以往我們都是通過maven添加httpclient ,java9直接引入即可
Java9所有特性都是為了提高性能和記憶體。。。。
為人:謙遜、激情、博學、審問、慎思、明辨、 笃行
學問:紙上得來終覺淺,絕知此事要躬行
為事:工欲善其事,必先利其器。
态度:道阻且長,行則将至;行而不辍,未來可期
轉載請标注出處!