JDK1.7新特性

  1. public class Test {  
        public void test(String type) {  
            switch (type) {  
            case "狀況A":  
                break;  
            case "狀況B":  
                break;  
            default:  
                break;  
            }  
        }  
    }
  2. public class Test {  
        public void test(String paramString) {  
            String str = paramString;  
            int i = -1;  
            switch (str.hashCode()) {  
            case 24455345:  
                if (!str.equals("狀況A"))  
                    break;  
                i = 0;  
                break;  
            case 24455346:  
                if (!str.equals("狀況B"))  
                    break;  
                i = 1;  
            }  
            switch (i) {  
            case 0:  
                break;  
            case 1:  
                break;  
            }  
        }  
    }
  3. 原理: jdk1.7在switch語句中能夠支持string類型的參數,實際上,這個新特性是在編譯器層次實現的,而在java虛擬機和字節碼層次上,仍是隻支持switch語句中使用與整數類型兼容的類型。這樣作的目的是爲了減小這個特性所影響的範圍,以下降實現的代價。在編譯器層次實現的含義是,雖然開發人員在java源代碼的switch語句中是用字符串類型,可是在編譯的過程當中,編譯器會根據源代碼的類型進行轉換,將字符串類型轉換成與整數類型兼容的類型,不一樣的java編譯器可能採用不一樣的方式類實現這個轉換,並採起不一樣的優化策略。java

  4. 從反編譯出來的代碼能夠看到,原來用在switch語句中的字符串被替換成了對應的哈希值,而case字句的值也被換成了原來字符串常量的哈希值,通過這樣的轉換,java虛擬機所看到的仍然是與整數類型兼容的類型,而case字句對應的語句塊仍然須要使用String的equals方法來進行字符串的比較。這是由於哈希函數在映射的時候可能存在衝突,多個字符串的哈希值多是同樣的,進行字符串的比較是爲了保證轉換以後的代碼邏輯與以前的徹底同樣
相關文章
相關標籤/搜索