從 Java 7 開始,我們可以在 switch case 中使用字串,但這僅僅是一個語法糖。內部實現在 switch 中使用字串的 hash code。
從 Java 7 開始,Java 語言支援在 switch
語句中直接使用 String
型別的變數。之前的版本只允許在 switch
語句中使用 整型
、列舉
和一些 特定的類
(比如 Character
、Byte
、Short
和 Integer
)。
使用字串作為 switch
條件時,實際上 Java 編譯器會做一些額外的工作。編譯器首先會獲取到每個 case
中字串的 hashCode
值,這是一個整型值。然後,switch
語句實際上是根據這個 hashCode
來轉換執行不同的 case
的。由於 hashCode
可能會出現碰撞(不同的字串可能有相同的 hashCode
),編譯器還會生成一段額外的程式碼來確保字串確實是相等的,以此來避免由於 hashCode
碰撞帶來的錯誤判斷。
簡單來說,當你在 switch
語句中使用字串時,Java 在底層做了這樣的處理:
- 計算
switch
條件中字串的hashCode
值。 - 用這個
hashCode
值來找到匹配的case
。 - 檢查詢到的
case
中的字串與switch
條件中的字串是否真正相等(使用.equals
方法)。 - 如果相等,則執行對應的程式碼塊;如果不相等,繼續檢查後面的
case
,或者執行default
塊(如果有的話)。
這個處理方式的好處是,你可以直接用字串來控制 switch
流程,而不用手動去寫一堆 if-else
條件判斷,看起來更加簡潔和清晰。但是需要注意 hashCode
的碰撞問題,雖然 Java 編譯器會幫你處理,但這也意味著,比起使用整型,使用字串作為 switch
條件可能會有更多的效能開銷。
在 Java 中,hashCode
是一個方法,它屬於 Object
類。由於 Object
類是所有 Java 類的父類,這意味著每個 Java 物件都有這個方法。hashCode
的作用是提供一個整數值,這個值被用作物件的 “雜湊碼”。
雜湊碼的主要用途之一是在雜湊表這類資料結構中快速查詢物件。雜湊表是一種常用的資料結構,用來儲存鍵值對(key-value pairs),它可以快速插入和檢索資料。
當 Java 中的 hashCode
方法被呼叫時,它會根據物件的內容(通常是物件中的欄位)來計算並返回一個整數值。對於同一個物件多次呼叫 hashCode
方法,只要物件的內容沒變,它應該總是返回相同的值。而不同的物件則可能會返回不同的值。
但是 “可能” 是關鍵詞——實際上,不同物件有時會產生相同的雜湊碼,這稱為雜湊碰撞。就像兩個不同的人可以有同一個電話號碼一樣。因此,在使用雜湊碼時,我們需要額外的邏輯來處理這種碰撞。
總結一下,hashCode
是物件的一個整數表示,主要用於快速查詢,但需要額外的步驟來確保精確的匹配,以防不同的物件產生相同的雜湊碼。在 switch
語句中使用字串,就涉及到了這些 hashCode
的處理過程。
完整程式碼可在此查閱:GitHub