0%

java string switch case

介紹

小時候所知道的 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 愈好用了。