欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?switch語句支持哪些類型以及原理詳解

 更新時間:2025年08月06日 09:20:13   作者:洋風(fēng)子  
Java中的switch語句是一種多分支選擇結(jié)構(gòu),它允許一個變量的值等于多個不同的常量時執(zhí)行不同的代碼塊,這篇文章主要介紹了Java?switch語句支持哪些類型以及原理的相關(guān)資料,需要的朋友可以參考下

一、switch的底層實現(xiàn)原理

Java 中的 switch 語句核心是通過跳轉(zhuǎn)表(Jump Table) 實現(xiàn)高效分支跳轉(zhuǎn),其本質(zhì)是「用整數(shù)映射快速定位分支」。編譯器會根據(jù) case 值的分布,將 switch 編譯為兩種字節(jié)碼指令:

  • tableswitch:當(dāng) case 值是連續(xù)的整數(shù)范圍(如 1、2、3、4)時使用。跳轉(zhuǎn)表直接通過「整數(shù)偏移量」定位分支,時間復(fù)雜度為 O(1),效率極高。

  • lookupswitch:當(dāng) case 值是離散的整數(shù)(如 1、3、5、7)時使用。跳轉(zhuǎn)表會先對 case 值排序,再通過二分查找定位分支,時間復(fù)雜度為 O(log n),效率略低于 tableswitch。

無論是哪種指令,都要求判斷條件必須能轉(zhuǎn)換為整數(shù)且支持精確匹配—— 這是 switch 對類型的核心限制。

二、適用類型

整數(shù)類型(byte/short/int)

  • 底層邏輯: 整數(shù)類型本身就是「天然的整數(shù)標(biāo)識」,無需轉(zhuǎn)換即可直接作為跳轉(zhuǎn)表的索引。

  • 特殊說明:

    • byteshort 會被自動提升為 int 后參與計算(因 Java 虛擬機(jī)運算以 int 為最小單位)。

  • 示例代碼:

byte a= 1;
short b=2;
int c=3;
switch (c) {
    case 1: System.out.println("byte"); break;  // case值為連續(xù)整數(shù),編譯為tableswitch
    case 2: System.out.println("short"); break;  // 直接通過整數(shù)2定位此處
    case 3: System.out.println("int"); break;
    default: System.out.println("未知");
}

字符類型(char)

  • 底層邏輯: char 本質(zhì)是「Unicode 編碼的整數(shù)」(范圍 0~65535),例如字符 'A' 對應(yīng)整數(shù) 65,'中' 對應(yīng)整數(shù) 20013。編譯器會將 char 自動轉(zhuǎn)換為對應(yīng)的整數(shù),再通過跳轉(zhuǎn)表定位分支,與整數(shù)類型的處理邏輯一致。

  • 示例代碼:

    char c = '中';
    switch (c) {
        case 'A': System.out.println("字母A(Unicode:65)"); break;
        case '中': System.out.println("漢字中(Unicode:20013)"); break;  // 匹配此處
        case '1': System.out.println("數(shù)字1(Unicode:49)"); break;
    }

枚舉類型(enum)

  • 底層邏輯: 每個枚舉常量都有一個內(nèi)置的 ordinal() 方法,返回其在枚舉定義中的「序號」(從 0 開始的整數(shù))。例如 enum Color {RED, GREEN, BLUE} 中,RED.ordinal()=0,GREEN.ordinal()=1。編譯器會將枚舉的 switch 轉(zhuǎn)換為對 ordinal() 結(jié)果的整數(shù) switch,本質(zhì)還是通過整數(shù)跳轉(zhuǎn)表實現(xiàn)。

  • 注意: 若枚舉類修改了常量順序(如插入新常量),ordinal() 的值會變化,可能導(dǎo)致 switch 邏輯出錯。因此枚舉 switch 依賴于枚舉定義的穩(wěn)定性。

  • 示例代碼:

enum Season { SPRING, SUMMER, AUTUMN, WINTER }
Season s = Season.SUMMER;
switch (s) {
    case SPRING: System.out.println("春天(ordinal=0)"); break;
    case SUMMER: System.out.println("夏天(ordinal=1)"); break; 
    case AUTUMN: System.out.println("秋天(ordinal=2)"); break;
}
// 底層等價于:switch (s.ordinal()) { case 0: ... case 1: ... }

字符串類型(String,Java 7+ 支持)

  • 底層邏輯: 字符串本身不是整數(shù),但 Java 7 后通過「hashCode() 哈希值 + equals() 精確匹配」間接支持 switch,步驟如下:

    • 計算字符串的 hashCode()(32 位整數(shù),由字符序列決定);

    • switch 轉(zhuǎn)換為對哈希值的整數(shù) switch(用 lookupswitch 定位分支);

    • 因哈??赡軟_突(不同字符串哈希值相同),需通過 equals() 二次驗證字符串內(nèi)容,確保匹配正確。

  • 示例代碼

    String a = "Java";
    switch (a) {
        case "java": System.out.println("小寫java"); break;
        case "Java": System.out.println("大寫Java"); break;  // 匹配此處
        default: System.out.println("未知");
    }
    
    // 編譯器生成的等效邏輯:
    int hash = a.hashCode();  // "Java"的hashCode()為2301506
    switch (hash) {
        case 3254818:  // "java"的hashCode()
            if (a.equals("java")) { ... } 
            break;
        case 2301506:  // "Java"的hashCode()
            if (a.equals("Java")) {  // 二次驗證防沖突
                System.out.println("大寫Java"); 
            }
            break;
    }

包裝類(Integer/Byte/Short/Character)

  • 底層邏輯: 包裝類通過自動拆箱轉(zhuǎn)換為基本類型(如 Integerint),再按基本類型的邏輯處理。例如 Integer 會調(diào)用 intValue() 方法轉(zhuǎn)為 int,之后參與跳轉(zhuǎn)表計算。

  • 注意: 若包裝類為 null,自動拆箱時會拋出 NullPointerException,需提前判空。

  • 示例代碼:

Integer score = 85;  // 包裝類
switch (score) {  // 自動拆箱為 int 85
    case 90: System.out.println("優(yōu)秀"); break;
    case 85: System.out.println("良好"); break;  // 匹配此處
    case 60: System.out.println("及格"); break;
}

三、不適用類型及深層原因

浮點數(shù)(float/double)

  • 核心原因:浮點數(shù)存在精度丟失問題,無法實現(xiàn)「精確匹配」。

  • 例:十進(jìn)制的 0.1 轉(zhuǎn)換為二進(jìn)制時,是一個無限循環(huán)的小數(shù)(類似十進(jìn)制的 1/3 = 0.3333...)。

  • 由于 floatdouble 的存儲空間有限(32 位和 64 位),只能存儲這個無限循環(huán)小數(shù)的前若干位,導(dǎo)致實際存儲的值與數(shù)學(xué)上的 0.1 存在微小誤差(即「精度丟失」)。

  • switch 支持浮點數(shù),可能出現(xiàn)與case 0.1 (整數(shù))無法匹配 的情況(因二進(jìn)制存儲不同),導(dǎo)致邏輯混亂.

長整型(long)

  • 核心原因:long 范圍過大(-9223372036854775808 ~ 9223372036854775807),無法構(gòu)建高效跳轉(zhuǎn)表。 跳轉(zhuǎn)表依賴「整數(shù)映射到內(nèi)存地址」,而 long 的值可能極其離散(如 1 和 10000000000),此時 lookupswitch 的二分查找效率大幅下降,甚至可能比 if-else 更慢。Java 為保證 switch 的高效性,直接禁止 long 作為條件。

布爾類型(boolean)

  • 核心原因:設(shè)計上的「冗余性」—— booleantrue/false 兩個值,用 if-else 更簡潔,無需 switch 冗余語法。 若支持 boolean,switch (flag) { case true: ... case false: ... }if (flag) { ... } else { ... } 功能完全一致,但后者可讀性更高。

四、使用switch的關(guān)鍵注意事項

1. case 值必須是「編譯期常量」

case 后的值必須是編譯器可確定的常量,不能是普通變量。原因是跳轉(zhuǎn)表需要在編譯期確定所有可能的分支值 

int a = 10;
final int b = 10;  // final變量是常量
switch (a) {
    case a:  // ? 錯誤:a是變量(非常量)
    case b:  // ? 正確:b是final常量(編譯期已知值)
        System.out.println("匹配10"); break;
}

2.字符串 switch 的額外注意

嚴(yán)格區(qū)分大小寫:"Java""java" 哈希值不同,視為不同分支。

避免 null:字符串為 null 時調(diào)用 hashCode() 會拋 NullPointerException,需提前判空。

String s = null;
if (s != null) {  // 先判空
    switch (s) { ... }
}

總結(jié)

switch 的核心是「整數(shù)映射跳轉(zhuǎn)表」,因此僅支持能轉(zhuǎn)換為整數(shù)且精確匹配的類型。

到此這篇關(guān)于Java switch語句支持哪些類型以及原理的文章就介紹到這了,更多相關(guān)Java switch語句詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java時區(qū)轉(zhuǎn)換及Date類實現(xiàn)原理解析

    Java時區(qū)轉(zhuǎn)換及Date類實現(xiàn)原理解析

    這篇文章主要介紹了Java時區(qū)轉(zhuǎn)換及Date類實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • Java圖片壓縮三種高效壓縮方案詳細(xì)解析

    Java圖片壓縮三種高效壓縮方案詳細(xì)解析

    圖片壓縮通常涉及減少圖片的尺寸縮放、調(diào)整圖片的質(zhì)量(針對JPEG、PNG等)、使用特定的算法來減少圖片的數(shù)據(jù)量等,這篇文章主要介紹了Java圖片壓縮三種高效壓縮方案的相關(guān)資料,需要的朋友可以參考下
    2025-04-04
  • Java?如何接收kernel傳過來的數(shù)組(推薦)

    Java?如何接收kernel傳過來的數(shù)組(推薦)

    這篇文章主要介紹了Java?如何接收kernel傳過來的數(shù)組,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-08-08
  • request如何獲取完整url(包括域名、端口、參數(shù))

    request如何獲取完整url(包括域名、端口、參數(shù))

    這篇文章主要介紹了request如何獲取完整url(包括域名、端口、參數(shù))問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring3?中?RabbitMQ?的使用與常見場景分析

    Spring3?中?RabbitMQ?的使用與常見場景分析

    本文介紹了Spring3中RabbitMQ的使用,涵蓋了RabbitMQ的基本知識、五種模式、數(shù)據(jù)隔離、消費者確認(rèn)、死信交換機(jī)、延遲功能、消息堆積解決方法、高可用性以及消息重復(fù)消費問題的解決方案,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • JavaApi實現(xiàn)更新刪除及讀取節(jié)點

    JavaApi實現(xiàn)更新刪除及讀取節(jié)點

    這篇文章主要介紹了JavaApi實現(xiàn)更新刪除及讀取節(jié)點,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組實例代碼

    Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組實例代碼

    這篇文章主要介紹了Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • java 學(xué)習(xí)筆記(入門篇)_java的安裝與配置

    java 學(xué)習(xí)筆記(入門篇)_java的安裝與配置

    學(xué)習(xí)Java已經(jīng)很長時間了,由于基礎(chǔ)不好遇到問題就無從下手,所以,打算寫Java的隨手筆記來鞏固基礎(chǔ),加強(qiáng)學(xué)習(xí),接下來講解java的安裝,配置等,感興趣的朋友可以參考下
    2013-01-01
  • Java實現(xiàn)簡易提款機(jī)

    Java實現(xiàn)簡易提款機(jī)

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)簡易提款機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • java讀取excel文件并復(fù)制(copy)文件到指定目錄示例

    java讀取excel文件并復(fù)制(copy)文件到指定目錄示例

    這篇文章主要介紹了java讀取excel文件并復(fù)制文件到指定目錄示例,需要的朋友可以參考下
    2014-02-02

最新評論