深刻理解Java 7(筆記)

  1. 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中已經能夠識別該錯誤。
  2. 數值分割
    通常咱們使用長整型或者浮點類型的常量時,常常會遇到數字位數數錯的問題,Java7現已支持使用下劃線做爲數字的分割符,編譯器在遇到數值中的下劃線時會直接忽略掉。
    long l = 100_111l;
     float f = 100_111.222_333f;
  3. 異常
    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;
         }
  4. try-with-resource
    這種處理異常的方式在須要關閉資源的場景中特別有用,好比數據庫鏈接、文件輸入輸出流。能夠將須要關閉的資源放入到try管理的塊中,無論是try中發生異常仍是catch中發生異常資源管理器都會關閉打開的資源,至關於替代了finally的做用,可是這種方式更加優雅。特別須要注意的是:管理的資源須要實現java.lang.AutoCloseable接口:
    try (FileInputStream fin = new FileInputStream("")) {
             fin.read();
         } catch (IOException e) {
             //異常處理
         }
  5. 變長參數
    Java5中引入了變長參數的概念:public void setNames(String... names)。變長參數的是以數組的方式存放的,這樣就帶來一個問題:若是我使用的是泛型類型的參數則會帶來警告信息:public void setNames(T... names)Java7以前通常使用unchecked來忽略這個警告信息,Java7引入了@SafeVarargs來抑制這個警告,這樣就不用在每次調用該方法時使用unchecked忽略警告。
  6. 腳本支持
    隨着編程語言的發展,腳本語言以其簡便、靈活的特性愈來愈受歡迎。多語言開發也成爲不少大型系統的選擇項之一。Java7中加強了對腳本語言的支持。
    一段腳本的執行須要腳本引擎來解釋處理,java中能夠經過腳本引擎的註冊機制來找到合適的執行者,而對於執行過程當中產生的數據交互問題則能夠經過javax.script.Bindings(參數及返回值綁定)接口來解決。腳本引擎的具體實現類會實現javax.script.ScriptEngine(腳本引擎的根類)接口,並持有javax.script.ScriptContext(執行上下文)對象,其中javax.script.ScriptContext則聲明瞭setBindings方法。
    而對於方法級別的調用則能夠經過javax.script.Invocable接口來實現。
    另外,對於某些類型的腳本能夠經過預編譯的方式提升調用的速度(javax.script.CompiledScript)。
  7. 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
  8. JNI
  9. 虛擬機 - 對象引用
  10. 虛擬機 - 內存
  11. 虛擬機 - 類加載
  12. 虛擬機 - 對象聲明週期
  13. 多線程 - volatile
  14. 多線程 - synchronized
  15. 多線程 - fork/join
  16. 多線程 - ThreadLocal
  17. 安全 - 加解密、簽名
  18. 安全 - HTTPS/SSL2.0
  19. Lambada
  20. 函數式編程
相關文章
相關標籤/搜索