最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Switch對(duì)各類型支持實(shí)現(xiàn)原理

 更新時(shí)間:2020年05月01日 10:29:19   作者:Hello_xzy_World  
這篇文章主要介紹了Java Switch對(duì)各類型支持實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

switch

Java7開(kāi)始,switch的參數(shù)可以是String類型了,這真的是一個(gè)很有用的改進(jìn),畢竟string還是挺常用的。到目前為止,switch支持的參數(shù)類型有:byte、short、int、char、String、enum。switch對(duì)各種類型參數(shù)的支持到底是怎么實(shí)現(xiàn)的呢?

byte、short、int

public class Main2 {
  public static void main(String[] args) {
    byte b = 1;
    switch (b) {
      case 0:
        System.out.println("0");
        break;
      case 1:
        System.out.println("1");
        break;
      default:
        System.out.println("other");
    }
  }
}

反編譯:

public class Main2 {
  public Main2() {
  }
  public static void main(String[] args) {
    byte b = 1;
    switch(b) {
      case 0:
        System.out.println("0");
        break;
      case 1:
        System.out.println("1");
        break;
      default:
        System.out.println("other");
    }
  }
}

將byte換成short、int,編譯后的結(jié)果與上面展示的基本相同。

char

public class Main2 {
  public static void main(String[] args) {
    char c = '0';
    switch (c) {
      case '0':
        System.out.println("0");
        break;
      case '1':
        System.out.println("1");
        break;
      default:
        System.out.println("other");
    }
  }
}

反編譯:

public class Main2 {
  public Main2() {
  }
  public static void main(String[] args) {
    char c = 48;
    switch(c) {
      case 48:
        System.out.println("0");
        break;
      case 49:
        System.out.println("1");
        break;
      default:
        System.out.println("other");
    }
  }
}

從反編譯的結(jié)果看,對(duì)char類型進(jìn)行比較的時(shí)候,實(shí)際比較的是字符對(duì)應(yīng)的ASCⅡ碼,編譯器把switch中char類型的變量轉(zhuǎn)換成int類型的變量。

String

public class Main2 {
  public static void main(String[] args) {
    String s = "0";
    switch (s) {
      case "0":
        System.out.println("0");
        break;
      case "1":
        System.out.println("1");
        break;
      default:
        System.out.println("other");
    }
  }
}

反編譯:

public class Main2 {
  public Main2() {
  }

  public static void main(String[] args) {
    String s = "0";
    byte var3 = -1;
    switch(s.hashCode()) {
      case 48:
        if (s.equals("0")) {
          var3 = 0;
        }
        break;
      case 49:
        if (s.equals("1")) {
          var3 = 1;
        }
    }

    switch(var3) {
      case 0:
        System.out.println("0");
        break;
      case 1:
        System.out.println("1");
        break;
      default:
        System.out.println("other");
     }
  }
}

從反編譯的結(jié)果看,switch借助hashCode()和equals()實(shí)現(xiàn)了對(duì)String的支持——先使用hashCode進(jìn)行初步判斷,然后使用equal()進(jìn)行二次校驗(yàn)(由于哈希沖突的存在,這個(gè)二次校驗(yàn)是必要的)。

public enum ColorEnum {
  RED, YELLOW, BLUE, GREED
}
public class Main {
  public static void main(String[] args) {
    ColorEnum color = ColorEnum.YELLOW;
    switch (color) {
      case RED:
        System.out.println("red");
        break;
      case YELLOW:
        System.out.println("yellow");
        break;
      default:
        System.out.println("other");
    }
  }
}

反編譯:

/*
 * Decompiled with CFR 0.149.
 */
package com.learn.java;

public final class ColorEnum
extends Enum<ColorEnum> {
  public static final /* enum */ ColorEnum RED = new ColorEnum("RED", 0);
  public static final /* enum */ ColorEnum YELLOW = new ColorEnum("YELLOW", 1);
  public static final /* enum */ ColorEnum BLUE = new ColorEnum("BLUE", 2);
  public static final /* enum */ ColorEnum GREED = new ColorEnum("GREED", 3);
  private static final /* synthetic */ ColorEnum[] $VALUES;

  public static ColorEnum[] values() {
    return (ColorEnum[])$VALUES.clone();
  }

  public static ColorEnum valueOf(String string) {
    return Enum.valueOf(ColorEnum.class, string);
  }

  private ColorEnum(String string, int n) {
    super(string, n);
  }

  static {
    $VALUES = new ColorEnum[]{RED, YELLOW, BLUE, GREED};
  }
}
/*
 * Decompiled with CFR 0.149.
 */
package com.learn.java;

import com.learn.java.ColorEnum;

public class Main {
  public static void main(String[] arrstring) {
    ColorEnum colorEnum = ColorEnum.YELLOW;
    switch (1.$SwitchMap$com$learn$java$ColorEnum[colorEnum.ordinal()]) {
      case 1: {
        System.out.println("red");
        break;
      }
      case 2: {
        System.out.println("yellow");
        break;
      }
      default: {
        System.out.println("other");
      }
    }
  }
}

上面的反編譯結(jié)果表明,switch借助枚舉類的序號(hào)實(shí)現(xiàn)對(duì)枚舉類的支持。

總結(jié)

其實(shí)switch只支持整型,其他數(shù)據(jù)類型都是轉(zhuǎn)換成整型后才使用的switch。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot3集成Zookeeper的代碼詳解

    SpringBoot3集成Zookeeper的代碼詳解

    ZooKeeper是一個(gè)集中的服務(wù),用于維護(hù)配置信息、命名、提供分布式同步、提供組服務(wù),分布式應(yīng)用程序以某種形式使用所有這些類型的服務(wù),本文將給大家介紹SpringBoot3集成Zookeeper的代碼,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Java的異常處理體系詳解

    Java的異常處理體系詳解

    這篇文章主要介紹了Java的異常處理體系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 淺談Spring Security LDAP簡(jiǎn)介

    淺談Spring Security LDAP簡(jiǎn)介

    這篇文章主要介紹了淺談Spring Security LDAP簡(jiǎn)介,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • springboot中請(qǐng)求路徑配置在配置文件中詳解

    springboot中請(qǐng)求路徑配置在配置文件中詳解

    這篇文章主要介紹了springboot中請(qǐng)求路徑配置在配置文件中,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java jdbc連接和使用詳細(xì)介紹

    java jdbc連接和使用詳細(xì)介紹

    這篇文章主要介紹了 java jdbc連接和使用詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 排查Java應(yīng)用內(nèi)存泄漏問(wèn)題的步驟

    排查Java應(yīng)用內(nèi)存泄漏問(wèn)題的步驟

    這篇文章主要介紹了排查Java應(yīng)用內(nèi)存泄漏問(wèn)題的步驟,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-11-11
  • 面試突擊之跨域問(wèn)題的解決方案詳解

    面試突擊之跨域問(wèn)題的解決方案詳解

    跨域問(wèn)題本質(zhì)是瀏覽器的一種保護(hù)機(jī)制,它的初衷是為了保證用戶的安全,防止惡意網(wǎng)站竊取數(shù)據(jù)。那怎么解決這個(gè)問(wèn)題呢?接下來(lái)我們一起來(lái)看
    2022-09-09
  • Java詳解HashMap實(shí)現(xiàn)原理和源碼分析

    Java詳解HashMap實(shí)現(xiàn)原理和源碼分析

    這篇文章主要介紹了Java關(guān)于HashMap的實(shí)現(xiàn)原理并進(jìn)行源碼分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 一文詳解Java17中LinkedList類的用法和應(yīng)用場(chǎng)景

    一文詳解Java17中LinkedList類的用法和應(yīng)用場(chǎng)景

    LinkedList 是 Java 集合框架中基于雙向鏈表實(shí)現(xiàn)的類,實(shí)現(xiàn)了 List 和 Deque 接口,本文將為大家介紹一下它在Java 17 中如何更高效的使用吧
    2025-03-03
  • Spring MVC實(shí)現(xiàn)的登錄攔截器代碼分享

    Spring MVC實(shí)現(xiàn)的登錄攔截器代碼分享

    這篇文章主要介紹了Spring MVC實(shí)現(xiàn)的登錄攔截器代碼分享,涉及攔截器的簡(jiǎn)單介紹,攔截器和過(guò)濾器的區(qū)以及攔截器實(shí)現(xiàn)代碼等相關(guān)內(nèi)容,這里分享給大家,供需要的朋友參考。
    2017-10-10

最新評(píng)論

玉树县| 巫溪县| 通化县| 铁岭县| 象州县| 教育| 诸暨市| 平罗县| 即墨市| 葵青区| 襄垣县| 肥东县| 新野县| 惠来县| 安西县| 泽库县| 陈巴尔虎旗| 郓城县| 台前县| 赣榆县| 五常市| 岳阳县| 永嘉县| 上杭县| 铁岭市| 象州县| 新巴尔虎右旗| 盐亭县| 汝阳县| 永年县| 屯昌县| 四川省| 宣城市| 沁水县| 廉江市| 五常市| 龙山县| 泰来县| 凤山县| 建德市| 沿河|