介紹
小時候所知道的 java 和 c/c++ 有支援 switch/case ,使用上也很好用。
但是我們知道的是支援整數值的,在 java 新的語法中,有支援到 String 。
我們今天就說一下這部份。
所以,對於編譯器來說,switch中其實只能使用整型,任何類型的比較都要轉換成整型。
比如byte。short,char(ackii碼是整型)以及int。
範例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class switchDemoString { public static void main(String[] args) { String str = "world"; switch (str) { case "hello": System.out.println("hello"); break; case "world": System.out.println("world"); break; default: break; } } }
|
編譯
上面的例子被編譯為下面的程式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class switchDemoString { public switchDemoString() { } public static void main(String args[]) { String str = "world"; String s; switch((s = str).hashCode()) { default: break; case 99162322: if(s.equals("hello")) System.out.println("hello"); break; case 113318802: if(s.equals("world")) System.out.println("world"); break; } } }
|
也就是 java 在編譯時,用 hashcode 及 equals 來確保 java
的對 switch/case 的支援不會有問題。
仔細看下可以發現,進行switch的實際是哈希值,然後通過使用equals方法比較進行安全檢查,
這個檢查是必要的,因為哈希可能會發生碰撞。
因此它的性能是不如使用枚舉進行switch或者使用純整數常量,但這也不是很差。
結論
java 愈好用了。