- Java程序員面試筆試寶典(第2版)
- 何昊等編著
- 959字
- 2022-06-17 16:00:44
1.10 switch使用時的注意事項
在使用switch(expr)的時候,expr只能是一個枚舉常量(內部也是由整型或字符類型實現)或一個整數表達式,其中整數表達式可以是基本類型int或其對應的包裝類Integer,當然也包括不同的長度整型,例如short。由于byte、short和char都能夠被隱式地轉換為int類型,因此這些類型以及它們對應的包裝類型都可以作為switch的表達式。但是,long、float、double、String類型由于不能夠隱式地轉換為int類型,因此它們不能被用作switch的表達式。如果一定要使用long、float或double作為switch的參數,必須將其強制轉換為int類型才可以。
例如以下使用就是非法的:

另外,與switch對應的是case語句,case語句之后可以是直接的常量數值,例如1、2,也可以是一個常量計算式,例如1+2等,還可以是final型的變量(final變量必須是編譯時的常量),例如final int a=0,但不能是變量或帶有變量的表達式,例如i*2等。當然更不能是浮點型數,例如1.1或1.2/2等。

隨著Java語言的發展,在Java7中,switch開始支持String類型了。以下是一段支持String類型的示例代碼:

從本質上來講,switch對字符串的支持,其實是int類型值的匹配。它的實現原理如下:通過對case后面的String對象調用hashCode()方法,得到一個int類型的hash值,然后用這個hash值來唯一標識著這個case。那么當匹配的時候,首先調用這個字符串的hashCode()方法,獲取一個hash值(int類型),用這個hash值來匹配所有的case,如果沒有匹配成功,說明不存在;如果匹配成功了,接著會調用字符串的String.equals()方法進行匹配。由此可以看出String變量不能為null,同時switch的case子句中使用的字符串也不能為null。
在使用switch的時候需要注意的另外一個問題是:一般在case語句結尾必須添加break語句。因為一旦通過switch語句確定了入口點,就會順序執行后面的代碼,直到遇到關鍵字break。否則,會執行滿足這個case之后的其他case語句而不管case是否匹配,直到switch結束或者遇到break為止。如果在switch中省略了break語句,那么匹配的case值后的所有情況(包括default情況)都會被執行。如下例所示:

程序運行結果為:

Java 12對switch表達式的寫法進行了進一步的擴展,使用新的寫法可以省去break語句,從而可以避免因漏寫break而出錯,同時還支持合并多個case的寫法,這種新的寫法讓代碼變得更加簡潔。語法為:case condition->,即如果條件匹配case condition,就執行->后面的代碼。示例代碼如下:


代碼運行結果為:

從上面的代碼可以看出,新的寫法可以省略break,同時合并了多個條件,從而使得代碼變得更加簡潔。在Java13和Java14中增加了yield關鍵字,同時可以對switch表達式進行賦值,示例代碼如下:
