Java 7中,switch的參數能夠是String類型了,這對咱們來講是一個很方便的改進。到目前爲止switch支持這樣幾種數據類型:byte short int char String 。switch對String的支持是使用equals()方法和hashcode()方法。緩存
1、switch對整型支持的實現安全
下面是一段很簡單的Java代碼,定義一個int型變量a,而後使用switch語句進行判斷。執行這段代碼輸出內容爲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
反編譯後的代碼以下:this
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; } } }
咱們發現,反編譯後的代碼和以前的代碼比較除了多了兩行註釋之外沒有任何區別,那麼咱們就知道,switch對int的判斷是直接比較整數的值。code
2、switch對字符型支持的實現遊戲
直接上代碼:ci
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 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; } } }
經過以上的代碼做比較咱們發現:對char類型進行比較的時候,實際上比較的是ascii碼,編譯器會把char型變量轉換成對應的int型變量get
3、switch對字符串支持的實現編譯器
仍是先上代碼:
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; } } }
看到這個代碼,你知道原來字符串的switch是經過equals()和hashCode()方法來實現的。記住,switch中只能使用整型,好比byte。short,char(ackii碼是整型)以及int。還好hashCode()方法返回的是int,而不是long。經過這個很容易記住hashCode返回的是int這個事實。仔細看下能夠發現,進行switch的實際是哈希值,而後經過使用equals方法比較進行安全檢查,這個檢查是必要的,由於哈希可能會發生碰撞。所以它的性能是不如使用枚舉進行switch或者使用純整數常量,但這也不是不好。由於Java編譯器只增長了一個equals方法,若是你比較的是字符串字面量的話會很是快,好比」abc」 ==」abc」。若是你把hashCode()方法的調用也考慮進來了,那麼還會再多一次的調用開銷,由於字符串一旦建立了,它就會把哈希值緩存起來。所以若是這個siwtch語句是用在一個循環裏的,好比逐項處理某個值,或者遊戲引擎循環地渲染屏幕,這裏hashCode()方法的調用開銷其實不會很大。
這就是Java 7如何實現的字符串switch。它使用了hashCode()來進行switch,而後經過equals方法進行驗證。這其實只是一個語法糖,而不是什麼內建的本地功能。選擇權在你,我我的來講不是很喜歡在switch語句中使用字符串,由於它使得代碼更脆弱,容易出現大小寫敏感的問題,並且編譯器又沒有作輸入校驗 。
接下來咱們再看下enum的用法:
enum Animal { DOG,CAT,BEAR; public static Animal getAnimal(String animal){ return valueOf(animal ); } } public class Client { public void caseAnimal(String animal){ switch(Animal.getAnimal(animal)){ case CAT: System.out.println("this is a cat"); break; case DOG: System.out.println("this is a dog"); break; case BEAR: System.out.println("this is a bear"); break; } } }
這是一種比較推薦的用法。