Java 7中,switch的參數可以是String類型了,這對我們來說是一個很方便的改進。到目前為止切換支持這樣幾種數據類型:byte
short
int
char
String
。但是,作為一個程序員我們不僅要知道他有多么好用,還要知道它是如何實現的,開關對整型的支持是怎么實現的呢?對字符型是怎么實現的呢?字符串類型呢?有一點的Java開發經驗的人這個時候都會猜測切換對串的支持是使用的equals()方法和哈希碼()方法。那么到底是不是這兩個方法呢?接下來我們就看一下,切換到底是如何實現的。
一,開關對整型支持的實現
下面是一段很簡單的Java的代碼,定義一個INT型變量一個,然后使用切換語句進行判斷。執行這段代碼輸出內容為5,那么我們將下面這段代碼反編譯,看看他到底是怎么實現的。
public class switchDemoInt {
public static void main(String[] args) {
int a = 5;
switch (a) {
case 1:
System.out.println(1);
break;
case 5:
System.out.println(5);
break;
default:
break;
}
}
}
//output 5
反編譯后的代碼如下:
public class switchDemoInt
{
public switchDemoInt()
{
}
public static void main(String args[])
{
int a = 5;
switch(a)
{
case 1: // '\001'
System.out.println(1);
break;
case 5: // '\005'
System.out.println(5);
break;
}
}
}
我們發現,反編譯后的代碼和之前的代碼比較除了多了兩行注釋以外沒有任何區別,那么我們就知道,切換對int的判斷是直接比較整數的值。
二,開關對字符型支持的實現
直接上代碼:
public class switchDemoInt {
public static void main(String[] args) {
char a = 'b';
switch (a) {
case 'a':
System.out.println('a');
break;
case 'b':
System.out.println('b');
break;
default:
break;
}
}
}
編譯后的代碼如下:`public class switchDemoChar
public class switchDemoChar
{
public switchDemoChar()
{
}
public static void main(String args[])
{
char a = 'b';
switch(a)
{
case 97: // 'a'
System.out.println('a');
break;
case 98: // 'b'
System.out.println('b');
break;
}
}
}
通過以上的代碼作比較我們發現:對字符類型進行比較的時候,實際上比較的是ASCII碼,編譯器會把炭型變量轉換成對應的INT型變量
三,開關對字符串支持的實現
還是先上代碼:
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;
}
}
}
對代碼進行反編譯:
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;
}
}
}
看到這個代碼,你知道原來字符串的開關是通過equals()
和hashCode()
方法來實現的。記住,開關中只能使用整型,比如byte
。short
,char
(ackii碼是整型)以及int
。還好hashCode()
方法返回的是int
,而不是long
,這個通過很容易記住hashCode
報道查看的的英文int
這個事實。仔細看下可以發現,進行switch
的實際的英文哈希值,然后通過使用等於方法比較進行安全檢查,這個檢查是必要的,因為哈希可能會發生碰撞。因此它的性能是不如使用枚舉進行切換或者使用純整數常量,但這也不是很差。因為爪哇器編譯只增加了一個equals
方法,如果你比較的是字符串字面量的話會非常快,比如“abc”==“abc”。如果你把hashCode()
方法的調用也考慮進來了,那么還會再多一次的調用開銷,因為字符串一旦創建了,它就會把哈希值緩存起來。因此如果這個switch
語句的英文用在一個循環里的,比如逐項處理某個值,或者游戲引擎循環地渲染屏幕,這里hashCode()
方法的調用開銷其實不 會很大。
好,以上就是關於開關對整型,字符型,和字符串型的支持的實現方式,總結一下我們可以發現,其實切換只支持一種數據類型,那就是整型,其他數據類型都是轉換成整型之后在使用開關的。