- switch
Java 7 中新增長了對String的支持,除此以外還支持int、char、byte、short及其封裝類Integer、Character、Byte、Short。對於基本類型的支持咱們很容易理解,可是String類型使用了不一樣的判斷方式,首先使用String的哈希值判斷,而後使用equals方法判斷(排除哈希值衝突),舉例說明: switch (str.hashCode()) {
case 97:
if (str.equals("a")) {
break;
}
case 98:
if (str.equals("b")) {
break;
}
}
switch要求case的值不能出現重複及null。有一種特殊狀況:使用含義相同的String及Unicode會不會致使編譯器沒法識別錯誤?例如使用:男與\u7537: switch (str) {
case "男":
break;
case "\u7537":
break;
}
最新版的Java 7中已經能夠識別該錯誤。
- 數值分割
通常咱們使用長整型或者浮點類型的常量時,常常會遇到數字位數數錯的問題,Java7現已支持使用下劃線做爲數字的分割符,編譯器在遇到數值中的下劃線時會直接忽略掉。 long l = 100_111l;
float f = 100_111.222_333f;
- 異常
Java7支持在一次捕捉中捕捉不一樣類型的異常,例如: try {
if (id == null)
throw new AccessDeniedException("path");
else
throw new FileNotFoundException();
} catch (AccessDeniedException | FileNotFoundException e) {
//xxx
}
另外對於須要從新封裝異常場景,Java7也支持將原始異常addSuppressed到拋出的異常中: try {
if (id == null)
throw new AccessDeniedException("path");
else
throw new FileNotFoundException();
} catch (AccessDeniedException | FileNotFoundException e) {
Exception e1= new RuntimeException();
e1.addSuppressed(e);
throw e1;
}
- try-with-resource
這種處理異常的方式在須要關閉資源的場景中特別有用,好比數據庫鏈接、文件輸入輸出流。能夠將須要關閉的資源放入到try管理的塊中,無論是try中發生異常仍是catch中發生異常資源管理器都會關閉打開的資源,至關於替代了finally的做用,可是這種方式更加優雅。特別須要注意的是:管理的資源須要實現java.lang.AutoCloseable接口: try (FileInputStream fin = new FileInputStream("")) {
fin.read();
} catch (IOException e) {
//異常處理
}
- 變長參數
Java5中引入了變長參數的概念:public void setNames(String... names)。變長參數的是以數組的方式存放的,這樣就帶來一個問題:若是我使用的是泛型類型的參數則會帶來警告信息:public void setNames(T... names)Java7以前通常使用unchecked來忽略這個警告信息,Java7引入了@SafeVarargs來抑制這個警告,這樣就不用在每次調用該方法時使用unchecked忽略警告。
- 腳本支持
隨着編程語言的發展,腳本語言以其簡便、靈活的特性愈來愈受歡迎。多語言開發也成爲不少大型系統的選擇項之一。Java7中加強了對腳本語言的支持。
一段腳本的執行須要腳本引擎來解釋處理,java中能夠經過腳本引擎的註冊機制來找到合適的執行者,而對於執行過程當中產生的數據交互問題則能夠經過javax.script.Bindings(參數及返回值綁定)接口來解決。腳本引擎的具體實現類會實現javax.script.ScriptEngine(腳本引擎的根類)接口,並持有javax.script.ScriptContext(執行上下文)對象,其中javax.script.ScriptContext則聲明瞭setBindings方法。
而對於方法級別的調用則能夠經過javax.script.Invocable接口來實現。
另外,對於某些類型的腳本能夠經過預編譯的方式提升調用的速度(javax.script.CompiledScript)。
- NIO
NIO並不是Java7才引入的特性,這裏只是DING一下。NIO的優點主要集中在異步IO上面,須要瞭解的知識點包括:Channel(通道)、Buffer(緩衝區)、Selector(選擇器)。經過下面的圖能夠簡單理解NIO與IO的不一樣: Stream Thread
|<--------------------------|read <-----
|send---------------------->|process |
| |loop----------->
Stream Buffer Thread
|<------------------|--------------------|read <-----
|send-------------->|buffer |do otherthing |
| |ready-------------->|process |
| |loop----------->
區別在Stream send數據的過程Thread是否在傻傻的等待。
固然實際狀況比這個更加複雜,能夠參考這篇文章:Java NIO
- JNI
- 虛擬機 - 對象引用
- 虛擬機 - 內存
- 虛擬機 - 類加載
- 虛擬機 - 對象聲明週期
- 多線程 - volatile
- 多線程 - synchronized
- 多線程 - fork/join
- 多線程 - ThreadLocal
- 安全 - 加解密、簽名
- 安全 - HTTPS/SSL2.0
- Lambada
- 函數式編程