在Java5以前,switch(expr)中,exper只能是byte,short,char,int類型(或其包裝類)的常量表達式。
從Java5開始,java中引入了枚舉類型,即enum類型。
從Java7開始,exper還可以是String類型。
但是long在所有版本中都是不可以的。
jdk1.7並沒有新的指令來處理switch string,而是通過調用switch中string.hashCode,將string轉換為int從而進行判斷。
hashcode返回的是int型
可以發現:進行switch的實際是hash值,然后用equals進行安全檢查(因為hash值可能會發生碰撞),所以性能不如枚舉。switch支持String其實是一個語法糖,在編譯后的字節碼文件中都會被還原成原生類型,並在相應位置插入了強制轉換代碼,底層的JVM在switch上並沒有修改。
當傳入switch的是null時,在運行時對一個null調用hashCode()方法,會拋出NullPointerException;如果case寫的是null,那么在編譯時無法求出hashcode,就會編譯報錯。