天天看點

java switch用法

Java 7中,switch的參數可以是String類型了,這對我們來說是一個很友善的改進。到目前為止switch支援這樣幾種資料類型:byte short int char String 。switch對String的支援是使用equals()方法和hashcode()方法。

一、switch對整型支援的實作

下面是一段很簡單的Java代碼,定義一個int型變量a,然後使用switch語句進行判斷。執行這段代碼輸出内容為5,那麼我們将下面這段代碼反編譯,看看他到底是怎麼實作的

反編譯後的代碼如下:

我們發現,反編譯後的代碼和之前的代碼比較除了多了兩行注釋以外沒有任何差別,那麼我們就知道,switch對int的判斷是直接比較整數的值。

二、switch對字元型支援的實作

直接上代碼:

編譯後的代碼如下:

通過以上的代碼作比較我們發現:對char類型進行比較的時候,實際上比較的是ascii碼,編譯器會把char型變量轉換成對應的int型變量

三、switch對字元串支援的實作

還是先上代碼:

對代碼進行反編譯:

看到這個代碼,你知道原來字元串的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的用法:

這是一種比較推薦的用法。