『Java 語法基礎』能在 Switch 中使用 String 嗎?

BNTang發表於2024-03-18

從 Java 7 開始,我們可以在 switch case 中使用字串,但這僅僅是一個語法糖。內部實現在 switch 中使用字串的 hash code。

從 Java 7 開始,Java 語言支援在 switch 語句中直接使用 String 型別的變數。之前的版本只允許在 switch 語句中使用 整型列舉 和一些 特定的類(比如 CharacterByteShortInteger)。

使用字串作為 switch 條件時,實際上 Java 編譯器會做一些額外的工作。編譯器首先會獲取到每個 case 中字串的 hashCode 值,這是一個整型值。然後,switch 語句實際上是根據這個 hashCode 來轉換執行不同的 case 的。由於 hashCode 可能會出現碰撞(不同的字串可能有相同的 hashCode),編譯器還會生成一段額外的程式碼來確保字串確實是相等的,以此來避免由於 hashCode 碰撞帶來的錯誤判斷。

簡單來說,當你在 switch 語句中使用字串時,Java 在底層做了這樣的處理:

  1. 計算 switch 條件中字串的 hashCode 值。
  2. 用這個 hashCode 值來找到匹配的 case
  3. 檢查詢到的 case 中的字串與 switch 條件中的字串是否真正相等(使用 .equals 方法)。
  4. 如果相等,則執行對應的程式碼塊;如果不相等,繼續檢查後面的 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

相關文章